題目:給定一個二叉樹的前序遍歷序列{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;
}