题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof

相似题目:

23.二叉搜索树的后序遍历序列考察对后序遍历的理解

解题思路:

  • 此题考查对先序遍历及中序遍历的理解,我们可以发现对于先序遍历来说其第一个值一定为二叉树的根节点
  • 此根节点将中序遍历分为左右子树,所以我首先找到中序遍历对应的根节点的索引 i
  • 左子树为先序遍历的(1,i+1),中序遍历的(0,i),右子树为先序遍历的(i+1, length-1),中序遍历的(i+1,length-1);
  • 时间复杂度为O(n)所有的节点都要被创建

解题代码:

  1. var buildTree = function(preorder, inorder) {
  2. if(!preorder.length || !inorder.length) return null;
  3. const root = new TreeNode(preorder[0]);
  4. let i = 0;
  5. for(;i<inorder.length;i++) {
  6. if(preorder[0] === inorder[i]) {
  7. break;
  8. }
  9. }
  10. root.left = buildTree(preorder.slice(1,i+1),inorder.slice(0,i));
  11. root.right = buildTree(preorder.slice(i+1),inorder.slice(i+1));
  12. return root;
  13. };