重建二叉树

剑指offer-牛客网

Posted by Y. on October 25, 2018

重建二叉树

题目描述

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

思路

递归思想,每次可以依据前序遍历的第一个元素,确定左子树和右子树。

代码

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function reConstructBinaryTree(pre, vin)
{
    return reConstruct(0, pre.length - 1, 0, vin.length, pre, vin);
    // write code here
    function reConstruct(preStart, preTreeEnd, inStart, inEnd, preOrder, vinOrder) {
        if(preStart > preTreeEnd || inStart > inEnd) {
            return null;
        }
        var root = new TreeNode(preOrder[preStart]);
        
        for(var i = inStart; i <= inEnd; i++) {
            if(vinOrder[i] == preOrder[preStart]) {
                root.left = arguments.callee(preStart + 1, preStart + i - inStart,
                                            inStart, i - 1, preOrder, vinOrder);
                root.right = arguments.callee(preStart + 1 + i - inStart, preTreeEnd,
                                             i + 1, inEnd, preOrder, vinOrder); 
                break;
            }
        }
        return root;
    }
}

运行时间:39ms
占用内存: 7104k

问题

  1. 二叉树的遍历详解(前序中序后序层次-递归和非递归):https://blog.csdn.net/gatieme/article/details/51163010
  2. 根据前序遍历和中序遍历,后序遍历和中序遍历重构二叉树:https://blog.csdn.net/ahaha413525642/article/details/78210024