(遞歸方法)不建立二叉樹模型求解“根據前序序列、中序序列寫出後序序列”的問題

(遞歸方法)不建立二叉樹模型求解“根據前序序列、中序序列寫出後序序列”的問題

思路

在這裏插入圖片描述
通過前序序列順序次序在中序序列中查找,利用中序序列的特性,向兩邊分治,先向左分治再向右分治,最後輸出根節點;
這種思路會有很多重複解,所以我們還需借用visited數組去除不必要的重複解,即可得到後序序列輸出而不建立二叉樹。

算法實現

#include<iostream>
using namespace std;
#define N 100
//    1
//  2   3
//#  4 5 6
// 前序 1 2 4 3 5 6
// 中序 2 4 1 5 3 6
// 後序 4 2 5 6 3 1
/**
    輔助方法
    在序列中查找
    @param  int[]   序列
    @param  int     查詢開始位置
    @param  int     查詢結束位置
    @param  int     待查詢元素
    @return int     查找到的元素的下標
*/
int search(int[],int,int,int);
/**
    根據前序和中序序列輸出後序序列的遞歸方法
    @param  int     前序序列的長度
    @param  int[]   前序序列
    @param  int     遍歷前序序列的開始位置
    @param  int[]   中序序列
    @param  int     中序序列遞歸開始位置
    @param  int     中序序列遞歸結束位置
*/
void postOrderSeq(int,int[],int,int[],int,int);

int visited[N]={0}; //防止重複訪問

int main(){
    int preOrderSeq[N] = {1,2,4,3,5,6},inOrderSeq[N] = {2,4,1,5,3,6};
    int len = 6;
    postOrderSeq(len,preOrderSeq,0,inOrderSeq,0,len);
}

int search(int inOrderSeq[],int inStart,int inEnd,int x){
    for(int i = inStart;i < inEnd;i++)
        if(inOrderSeq[i] == x)return i;
    return -1;
}

void postOrderSeq(int len,int preOrderSeq[],int preStart,int inOrderSeq[],int inStart,int inEnd){
    for(int i = preStart;i < len;i++){
        int index = search(inOrderSeq,inStart,inEnd,preOrderSeq[i]);
        if(index != -1&&visited[index]!=1) {
            visited[index] = 1;
            postOrderSeq(len,preOrderSeq,i,inOrderSeq,0,index);
            postOrderSeq(len,preOrderSeq,i,inOrderSeq,index+1,inEnd);
            cout<<preOrderSeq[i]<<" ";
        }
    }
}

在這裏插入圖片描述

本博客其他文章推薦

算法設計與分析之半數集問題

關於C++整型數組自動初始化爲零的情況記錄

算法設計與分析之線性時間選擇

算法設計與分析之分治策略練習(下)

算法設計與分析之分治策略練習(上)

算法設計與分析之分治策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章