题目描述:给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。
示例:例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
解题思路:在解决这题之前,我们需要知道如何从前序遍历序列和中序遍历序列中重见二叉树。
简要步骤如下:
1.前序遍历的首个元素{ 1,2,4,7,3,5,6,8}作为二叉树的根节点。
2.在中序序列中找到第一次这个元素出现的地方{ 4,7,2,1,5,3,8,6}。
3.将中序遍历序列分割为左右两份,左边的{4,7,2}在根节点的左边,右边的{5,3,8,6}在根节点的右边。
4.分割后,左子树的前序为{2,4,7},中序为{4,7,2},右子树前序为{3,5,6,8},中序为{5,3,8,6}。
5.采用递归实现,依次重复上述步骤即可实现。
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
//求取数组长度
if(pre.size()<1)
return nullptr;
int aSize = pre.size();
//找出pre第一个数字在vin中的位置
int preFirstpos;
for(int i=0;i<aSize;i++)
{
if(vin[i] == pre[0])
{
preFirstpos = i;
break;
}
}
//将前序遍历序列和中序遍历序列中的左子树分割
TreeNode *head = new TreeNode(pre[0]);
vector<int> pre1(pre.begin()+1,pre.begin()+preFirstpos+1);
vector<int> vin1(vin.begin(),vin.begin()+preFirstpos);
head->left = reConstructBinaryTree(pre1,vin1);
//将前序遍历序列和中序遍历序列中的右子树分割
vector<int> pre2(pre.begin()+preFirstpos+1,pre.end());
vector<int> vin2(vin.begin()+preFirstpos+1,vin.end());
head->right = reConstructBinaryTree(pre2, vin2);
return head;
}