微信公众号:
题目:输入某二又树的前序遍历和中序遍历的结果,请重建该二树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
完整代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
//检查输入的合法性
if(pre.size()==NULL||vin.size()==NULL)
return NULL;
//创建根结点,根结点肯定是前序遍历的第一个元素
TreeNode *root=new TreeNode(pre[0]);
//创建前序遍历的左右子树
vector<int>pre_left,pre_right;
vector<int>vin_left,vin_right;
//中序遍历寻找根结点的位置
int i; //遍历游标
//当没有超过树的大小且不等于前序遍历的第一个数时
for(i=0;i<vin.size()&&pre[0]!=vin[i];)
i++;//一直遍历下去
//至此中序遍历的根结点的位置已经找到
int pre_i=1;//前序遍历的游标
for(int j=0;j<vin.size();j++)
{
//创建左子树
if(j<i)//i为中序遍历中根结点的位置
{
vin_left.push_back(vin[j]);
pre_left.push_back(pre[pre_i]);
pre_i++;//前序游标移动
}
//创建右子树
else if(j>i)
{
vin_right.push_back(vin[j]);
pre_right.push_back(pre[pre_i]);
pre_i++;
}
}
//递归调用函数创建左子树
root->left=reConstructBinaryTree(pre_left,vin_left);
//递归调用函数创建右子树
root->right=reConstructBinaryTree(pre_right,vin_right);
return root;
}
};