题目描述:
给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
提示:
1.vin.length == pre.length
2.pre 和 vin 均无重复元素
3.vin出现的元素均出现在 pre里
4.只需要返回根结点,系统会自动输出整颗树做答案对比
数据范围:n≤2000,节点的值:−10000≤val≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
示例:
输入:
[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值:
{1,2,3,4,#,5,6,#,7,#,#,8}
说明:
返回根节点,系统会输出整颗二叉树对比结果,重建结果如题面图示
解题思路:
本题考察数据结构树的使用。根据前序、中序、后序的排序重建二叉树是很常见的题目,也很基础。本题是前序和中序,前序遍历的顺序是:根结点->左子树->右子树,中序遍历的顺序是:左子树->根结点->右子树。即根节点存在前序首个位置,也存在中序遍历中间的某个位置,那么中序遍历根节点左侧的就是左子树,而前序遍历根节点后面同等数量的结点也是左子树,将这两个左子树类似操作,寻找左子树的根节点,右侧右子树同理。依次类推一层层锁定根节点,用递归很轻易的就能还原二叉树。
测试代码:
/** * 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()==0) return nullptr; int first=pre[0],pos_in_mid=0; TreeNode* head=new TreeNode(first); for(pos_in_mid=0;pos_in_mid<vin.size();++pos_in_mid) { if(vin[pos_in_mid]==first) break; } head->left=reConstructBinaryTree( {pre.begin()+1,pre.begin()+1+pos_in_mid}, {vin.begin(),vin.begin()+pos_in_mid}); head->right=reConstructBinaryTree( {pre.begin()+1+pos_in_mid,pre.end()}, {vin.begin()+1+pos_in_mid,vin.end()}); return head; } };