一、题目描述
输入某二叉树的前序遍历和中序遍历,重建该二叉树。
二、思路
二叉树的前序遍历:第一个数字即为根节点的值
二叉树的中序遍历:根节点的值在中间,其左边为左子树节点的值,右边为右子树节点的值。
这样就找到了左、右子树前序遍历和中序遍历,然后用同样的方法构建左、右子树。利用递归的方式完成。
三、代码实现
Struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
Class Solution{
public:
TreeNode* reConstructBinary(vector<int> pre ,vector<int> vin){
if (pre.empty()||vin.empty()) return NULL;
TreeNode *root=new TreeNode(pre[0]); //依据先序遍历的第一个数字创建根节点
int leftLength=0;
int RightLength=0;
for(int i=0;i<vin.size();i++) //在 中序遍历中寻找 根节点
{
if(vin[i]==pre[0])
{
leftLength=i+1;
rightlength=vin.size()-i-1;
break;
}
}
vector<int> pre_left,in_left,pre_right,in_right; //左、右子树的前序遍历和中序遍历。
for(int j=0;j<leftLength;j++)
{
pre_left.push_back(pre[1+j]); // 左子树的 前序遍历
in_left.push_back(vin[j]); // 左子树的 中序遍历
}
for(int j=0;j<rightLenth;j++)
{
pre_right.push_back(pre[leftLength+1+j]); // 右子树的 前序遍历
in_right.push_back(vin[leftLength+1+j]); // 左子树的 中序遍历
}
root->left=reConstructBinary(pre_left,in_left);
root->right=reConstructBinary(pre_right,in_right);
return root;
}
}