题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
-
通过前序遍历确定根节点。(左子树和右子树是一样的操作)
-
然后通过中序遍历划分左、右子树。
-
递归构建左、右子树。
Demo:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)
{
if (pre.empty() || vin.empty())
return NULL;
int index = 0;
int sz = vin.size();
// 在中序遍历中查找根节点所在位置
for (; index < sz; ++index)
{
if (vin[index] == pre[0])
break;
}
TreeNode* root = new TreeNode(pre[0]);
vector<int> leftpre, leftvin;
vector<int> rightpre, rightvin;
// 根据根节点的位置分别构造左、右子树的前序遍历和中序遍历数组
for (int j = 0; j < index; ++j)
{
leftpre.push_back(pre[j+1]);
leftvin.push_back(vin[j]);
}
for (int j = index + 1; j < sz; ++j)
{
rightpre.push_back(pre[j]);
rightvin.push_back(vin[j]);
}
// 递归构建左、右子树
root->left = reConstructBinaryTree(leftpre, leftvin);
root->right = reConstructBinaryTree(rightpre, rightvin);
return root;
}