输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int pre_size = pre.size();
int vin_size = vin.size();
if(pre_size != vin_size || pre_size == 0) //判断参数的值是否合法不合法返回空指针
{
return nullptr;
}
return constructTree(pre, 0, pre_size - 1, vin, 0, vin_size - 1);
}
TreeNode* constructTree(vector<int>& pre, int pre_start, int pre_end,
vector<int>& vin, int vin_start, int vin_end)
{
TreeNode* root = new TreeNode(pre[pre_start]); //取根节点
if(pre_start == pre_end) //判断是否只有一个节点,如只有一个节点直接返回根节点
{
return root;
}
int rootValue = pre[pre_start];
int index;
for(index = vin_start; index <= vin_end; index++) //找到中序遍历的根节点位置
{
if(vin[index] == rootValue)
{
break;
}
}
int left_Tree_Length = index - vin_start; //计算左子树长度
int right_Tree_Length = vin_end - index; //计算右子树长度
if(left_Tree_Length > 0) //递归求左子树
{
root->left = constructTree(pre, pre_start + 1, pre_start + left_Tree_Length,
vin, vin_start, index - 1);
}
if(right_Tree_Length > 0) //递归求右子树
{
root->right = constructTree(pre, pre_start + 1 + left_Tree_Length, pre_end,
vin, index + 1, vin_end);
}
return root;
}
};