剑指offer JS题解 (4)重建二叉树

题目描述

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

解题思路

根据数据结构的知识,前序遍历是{根节点|左子树|右子树},中序遍历是{左子树|根节点|右子树},可以发现前序遍历序列的第一个结点必然是根节点,利用这一特点,可以结合其他遍历序列来重建二叉树。

构建一下伪代码:
1、首先两个序列其一为空时,二叉树结点为空。
2、若俩序列不为空(默认序列长度相同),可以通过前序遍历序列前端的根节点,从中序遍历序列中划分出左子树与右子树。再通过左右子树的长度,从前序遍历序列中分割出左右子树。
3、按照上述过程,对左右子树的前序遍历序列和中序遍历序列递归执行。

Code

/* 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)
    };
}

运行环境:JavaScript (V8 6.0.0)
运行时间:29ms
占用内存:6772k

猜你喜欢

转载自blog.csdn.net/qq_40340478/article/details/106131052