1. 程式人生 > 資訊 >華為、李洪元事件民事判決書曝光:後者自願離職,法院駁回其要求

華為、李洪元事件民事判決書曝光:後者自願離職,法院駁回其要求

深度優先搜尋

class Solution {

    public TreeNode buildTree(int[] inorder, int[] postorder) {

        return buildSonTree(inorder, 0, inorder.length, postorder, 0, postorder.length);
    }

    /**
     * 左閉右開區間
     * 將後序陣列的最後一個元素作為根節點,然後找到中序陣列中根節點的位置,將其一分為二
     * 然後根據左右子陣列的長度,將後序陣列也分成相等長度的左右子陣列,繼續遞迴分割(因為兩個陣列長度相等)
     * 定義分割方法,分別傳入兩個陣列,和要分割陣列的邊界
     */
    public TreeNode buildSonTree(int[] inorder, int inLeft, int inRight, int[] postorder, int postLeft, int postRight){

        /**
         * 如果陣列為空,或者只有一個元素,則該節點就是根節點
         */
        if (inRight - inLeft == 0){
            return null;
        }

        if (inRight - inLeft == 1){
            return new TreeNode(inorder[inLeft]);
        }

        /**
         * 否則記錄下根節點的位置
         */
        int rootVal = postorder[postRight - 1];
        TreeNode root = new TreeNode(rootVal);

        int index = 0;

        for (int i = inLeft; i < inRight; i++) {

            if (inorder[i] == rootVal){

                index = i;
                break;
            }
        }

        /**
         * 然後傳入新的陣列邊界,繼續分割
         */
        root.left = buildSonTree(inorder, inLeft, index, postorder, postLeft, postLeft + index - inLeft);
        root.right = buildSonTree(inorder, index + 1, inRight, postorder, postLeft + index - inLeft, postRight - 1);

        return root;
    }
}

/**
 * 時間複雜度 O(n)
 * 空間複雜度 O(n)
 */

https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/