剑指offer-重建二叉树

Posted by franki on April 22, 2021

重建二叉树

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

思路

1 前序遍历的特点是(根左右),所以第一个值为根节点 2 找到中序遍历中根节点的下标,这个下标也代表左节点的个数 3 根据左节点和右节点构建左右子树

代码

var buildTree = function(preorder, inorder) {
    if (preorder.length === 0 || inorder.length === 0) {
        return null;
    }
    const root = preorder[0];
    const node = new TreeNode(root);
    const index = inorder.indexOf(root);
    const preLeft = preorder.slice(1, index+1);
    const preRight = preorder.slice(index+1);
    const inLeft = inorder.slice(0, index);
    const inRight = inorder.slice(index+1);
    node.left = buildTree(preLeft, inLeft);
    node.right = buildTree(preRight, inRight);
    return node;
};

复杂度分析

  • 时间复杂度: O(N^2)
  • 空间复杂度: O(1)