题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
题目分析:
1、由题目可知,用前序序列和中序序列来确定出二叉树的结构;
2、前序序列的第一个结点一定为根节点,所以在中序序列中,此根节点的左边都在二叉树的左半边,根节点的右边数据都在二叉树的右半边;(前序遍历:根左右; 中序遍历:左根右; 后序遍历:左右根)
3、依照上述规则,递归根节点左边和右边,则就得到了二叉树的结构,返回根节点。
代码实现:
/*
* 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 len = vin.size(); //计算序列长度
if(len == 0)
{
return NULL;
}
int p = 0;
vector<int> L_pre,L_vin,R_pre,R_vin; //左半边的前序、中序序列对象,右半边的前序、中序序列对象
TreeNode* root = new TreeNode(pre[0]); //确定根节点
for(int i = 0; i < len; i++)
{
if(vin[i] == pre[0]) //查找根节点在中序序列中的位置
{
p = i;
break;
}
}
for(int i = 0; i < p; i++)
{
L_pre.push_back(pre[i+1]); //根节点左半边前序序列
L_vin.push_back(vin[i]); //根节点左半边中序序列
}
for(int i = p + 1; i < len; i++)
{
R_pre.push_back(pre[i]); //根节点右半边前序序列
R_vin.push_back(vin[i]); //根节点右半边中序序列
}
root->left = reConstructBinaryTree(L_pre,L_vin); //左半边递归
root->right = reConstructBinaryTree(R_pre,R_vin); //右半边递归
return root;
}
};