面試題7——重建二叉樹

題目:給定一個二叉樹的前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},重構這棵二叉樹。

自己的思路:
1、看到樹應該想到的是遞歸,樹和遞歸基本是分不開的,那麼我們可以通過前序遍歷確定樹的根節點以及子樹的根節點,然後遍歷中序序列找到根節點,依據中序序列的特點,在根節點左邊的是左子樹,在根節點右邊的是右子樹。以此遞歸即可

實現代碼:

#include<iostream>
#include<string>
//#include<stack>

using namespace std;
struct TreeNode{
    int data;
    TreeNode *right_child;
    TreeNode *left_child;
};
const int pre_order[8] = {1,2,4,7,3,5,6,8};
const int in_order[8] = {4,7,2,1,5,3,8,6};

TreeNode *BuildTree(int p_b, int p_e, int i_b, int i_e){
    for(int i = i_b; i<i_b; i++){
        if(in_order[i] == pre_order[p_b]){
            break;
        } 
    }
    TreeNode *root = new TreeNode;
    root->data = pre_order[p_b];
    if(p_b+1 < p_b+i - i_b){
        root->left_child = BuildTree(p_b+1, p_b+i - i_b, i_b, i-1);
       
    }
    if(p_b + i - i_b < p_e){
         root->right_child = BuildTree(p_b+ i - i_b,p_e, i+1, i_e);
    }
    else{
        root->right_child = nullptr;
        root->left_child = nullptr;
    }
    return root;
}

TreeNode* main(){

    TreeNode *T = new TreeNode;
    T = BuildTree(0,7,0,7);
    return T;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章