華為、李洪元事件民事判決書曝光:後者自願離職,法院駁回其要求
阿新 • • 發佈:2022-01-13
深度優先搜尋
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/