剑指offer(4)重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回

题目分析

本题主要考察了二叉树的遍历,先复习下

前序遍历(VLR): 
    1.访问根节点 
    2.前序遍历左子树 
    3.前序遍历右子树 
中序遍历(LVR): 
    1.中序遍历左子树 
    2.访问根节点 
    3.中序遍历右子树 
后序遍历(LRV): 
    1.后序遍历左子树 
    2.后序遍历右子树 
    3.访问根节点

总之,做这种有关树、链表的题一定要有递归的思想,总之该题的解题思路就是四步,具体思路可以参考这里

1 确定根,确定左子树,确定右子树。

2 在左子树中递归。

3 在右子树中递归。

4 打印当前根。

代码

/* function TreeNode(x) {
 this.val = x;
 this.left = null;
 this.right = null;
 } */
function reConstructBinaryTree(pre, vin) {
  // write code here
  if (pre.length === 0 || vin.length === 0) {
    return null;
  }
  // 前序第一个是根节点,也是中序左右子树的分割点
  const index = vin.indexOf(pre[0]),
    left = vin.slice(0, index),
    right = vin.slice(index + 1);
  return {
    val: pre[0],
    // 递归左右子树的前序、中序
    left: reConstructBinaryTree(pre.slice(1, index + 1), left),
    right: reConstructBinaryTree(pre.slice(index + 1), right)
  };
}

 

posted @ 2017-10-18 10:33  汕大小吴  阅读(2101)  评论(0编辑  收藏  举报