算法挑战25:从中序后续遍历构造二叉树

3 阅读1分钟

题目:

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

思路:

与上一题很像,只不过把前序遍历数组换成了后序遍历

直接上代码

var buildTree = function (inorder, postorder) {

    let map = {};

    for (let i = 0; i < inorder.length; i++) {

        map[inorder[i]] = i;
    }

    return build(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);

    function build(inorder, inStart, inEnd ,postorder, postStart, postEnd) {

        //base case

        if (inStart > inEnd) return null;

        //后续数组的最后一个元素是当前根节点

        let rootVal = postorder[postEnd];

        //获取根节点在中序遍历数组中的索引

        let index = map[rootVal];

        //左子树的长度

        let leftSize = index - inStart;

        // let rightSize = inEnd - index;

        //构建根节点

        let root = new TreeNode(rootVal);

        //递归构建左右子树

        root.left = build(inorder, inStart, index - 1, postorder, postStart, postStart + leftSize - 1);

        root.right = build(inorder, index + 1, inEnd, postorder,

            postStart + leftSize, postEnd - 1)

        return root;

    }

};