输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
#include<iostream>
#include<vector>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x): val(x), left(NULL), right(NULL){}
};
//利用前序和中序 重建二叉树
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)
{
int len = pre.size();
if(len == 0) return NULL; //递归结束条件
TreeNode* T = new TreeNode(pre[0]);
if(len == 1) return T; //递归结束条件
int pre_i, pos;
for(int i=0; i<len; ++i){
if(vin[i] == pre[0]){
pos = i;
break;
}
}
vector<int> pre_left, pre_right,vin_left,vin_right;
for(int j=0; j<=pos; ++j)
vin_left.push_back(vin[j]);
for(int k=1; k<=pos; ++k)
pre_left.push_back(pre[k]); //分别将前序和中序中左子树 的元素放到vector中
for(int j = pos+1; j<len; ++j)
vin_right.push_back(vin[j]);
for(int k = pos+1; k<len; ++k)
pre_right.push_back(pre[k]); //分别将前序和中序中右子树 的元素放到vector中
T->left = reConstructBinaryTree(pre_left,vin_left); //构建左子树
T->right = reConstructBinaryTree(pre_right,vin_right); //构建右子树
return T;
}