1. 程式人生 > 其它 >leetcode105.從前序與中序遍歷序列構造二叉樹

leetcode105.從前序與中序遍歷序列構造二叉樹

leetcode105.從前序與中序遍歷序列構造二叉樹

題目

給定一棵樹的前序遍歷 preorder 與中序遍歷 inorder。請構造二叉樹並返回其根節點。

用例

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
Input: preorder = [-1], inorder = [-1]
Output: [-1]

求解

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
 */
var buildTree = function(preorder, inorder) {
    //遞迴構建
    return tree(0,preorder.length-1,0,inorder.length-1,preorder, inorder)

    function tree(pre_left,pre_right,in_left,in_right,preorder,inorder){
        if(in_left>in_right){
            return null
        }
        let root = new TreeNode()
        root.val = preorder[pre_left]
        let in_mid = 0
        for(let i = in_left;i<=in_right;i++){
            if(preorder[pre_left]==inorder[i]){
                in_mid = i
                break
            }
        }
        root.left = tree(pre_left+1,pre_left+(in_mid-in_left),in_left,in_mid-1,preorder,inorder)
        root.right = tree(pre_left+(in_mid-in_left)+1,pre_right,in_mid+1,in_right,preorder,inorder)
        return root
        }
};