例子:假设输入的前序遍历和中序遍历的结果中都不含重复的数字。前序序列 vector<int > pre:【1,2,3,4,7,3,5,6,8】 中序序列 vector<int> in:【4,7,2,1,5,3,8,6】 要求重建二叉树并返回。
一、思路:分治法。
1、以前序第一个元素创建根节点,在中序序列中找到该元素。左边的全部为左孩子上的结点。右边的全部为右孩子上的结点。
2、记录前序序列中左孩子的结点 vector<int>pre_left 和中序序列中的左孩子结点 vector<int>in_left 。前序序列中右孩子结点 vector<int> pre_right 以及中序遍历中右孩子结点 vector<int> in_right 。
3、传递pre_left和in_left重复步骤一,相当于构造左子树。传递pre_right 和 in_right 重复步骤一,相当于构造右子树。直到vector.size()为0时,返回NULL;
4、函数最后返回root即可
二、代码
1、结点的构造:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
2、重建函数:
TreeNode* reConstructBinaryTree(vector<int >pre,vector<int >in){
int n=pre.size();
if(n==0)
return NULL;
vector<int >pre_left,pre_right,in_left,in_right;
int a=pre[0];
TreeNode *root = new TreeNode(a);
int i;
for(i=0;i<pre.size();i++)
if(a==in[i])
break;
for(int j=0;j<i;j++){
pre_left.push_back(pre[j+1]);
in_left.push_back(in[j]);
}
for(int j=i+1;j<n;j++){
pre_right.push_back(pre[j]);
in_right.push_back(in[j]);
}
root->left=reConstructBinaryTree(pre_left,in_left);
root->right=reConstructBinaryTree(pre_right,in_right);
return root;
}
3、测试