给出某二叉树的前序遍历和中序遍历,重建二叉树。假设输入的前序遍历和中序遍历结果中不含重复的数字。例如输入前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历{4,7,2,1,5,3,8,6},重建二叉树并返回。
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL){};
};
class solution
{
public:
struct TreeNode *reBulidTree(vector<int>pre, vector<int>in)
{
int prelen = pre.size();//确定长度;
if (prelen == 0)
return NULL;
vector<int> left_pre, right_pre, left_in, right_in;
TreeNode *head = new TreeNode(pre[0]);//创建根节点
//找中序遍历中的根节点
int gen = 0;
for (int i = 0; i < prelen; i++)
{
if (in[i] == pre[0])//gen为根节点在中序遍历中的位置;
{
gen = i;
break;
}
}
//将左右子树分开,依次递归;
for (int i = 0; i < gen; i++)
{
left_in.push_back(in[i]);//以gen为分界点,将中序遍历分为左右子树;left_in存左子树中序遍历;
left_pre.push_back(pre[i + 1]);//left_pre存左子树前序遍历;
}
for (int i = gen + 1; i < prelen; i++)
{
right_in.push_back(in[i]);//以gen为分界点,将中序遍历分为左右子树,right_in存右子树中序遍历;
right_pre.push_back(pre[i]);//right_pre存右子树前序遍历;
}
head->left = reBulidTree(left_pre, left_in);
head->right = reBulidTree(right_pre, right_in);
return head;
}