输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
/**
-
Definition for binary tree
-
struct TreeNode {
-
int val;
-
TreeNode *left;
-
TreeNode *right;
-
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
-
};
/
//要重建一棵二叉树,必须知道前序和中序遍历或者中序和后序遍历,前序和中序分别从最开始和最后确定根节点位置
//然后重点就是在中序遍历集合中找到根节点的位置,从而确定左子树和右子树的位置,从而递归的建立左右子树
class Solution {
//这里实现前序+中序重建二叉树:从前序遍历可知,前序遍历数组pre的首元素就是二叉树的根结点,然后根据根结点的值在中序遍历中找到根结点的位置,那么根结点左边就为左子树的序列,
//根结点右边就是右子树的序列。
public:
TreeNode rebuild(vector &pre,int pre_left,int pre_right,vector& vin,int vin_left,int vin_right){
if(pre_left>pre_right){
return nullptr;
}
TreeNode* root=new TreeNode(pre[pre_left]);//利用前序遍历创建根节点
for(int i=vin_left;i<=vin_right;++i){
if(vin[i]==root->val){//在中序遍历中中找到根节点,此时的i就是根节点的序号
root->left=rebuild(pre,pre_left+1,pre_left+i-vin_left,vin,vin_left,i-1);//限定在前序和中序中的左子树对应的下标
root->right=rebuild(pre,pre_left+i-vin_left+1,pre_right,vin,i+1, vin_right);//限定在前序和中序中的右子树对应的下
break;
}
}
return root;
}
TreeNode* reConstructBinaryTree(vector pre,vector vin) {
return rebuild(pre,0,pre.size()-1,vin,0,vin.size()-1);}
};