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

Borris發表於2020-02-18

解法一 遞迴

思路

前序遍歷順序為 中 - 左 - 右,中序遍歷的順序為 左 - 中 - 右。這意味著前序遍歷的第一個元素必為根節點,我們需要在中序遍歷中找到這個節點的索引,隨後中序遍歷陣列中這個索引左邊的陣列是左子樹,右邊的所有元素是右子樹。

程式碼
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || preorder.length == 0 || inorder == null || inorder.length == 0) {
            return null;
        }

        return helper(preorder, inorder, 0, 0, inorder.length - 1);
    }

    private TreeNode helper(int[] preorder, int[] inorder, int preSt, int inSt, int inEnd) {
        if (inSt > inEnd || preSt > preorder.length) {
            return null;
        }

        // Set the first value in preorder as root node
        TreeNode head = new TreeNode(preorder[preSt]);

        // Look for the root node index in inorder traversal
        int i = inSt;
        while (i <= inEnd) {
            if (inorder[i] == preorder[preSt]) {
                break;
            }
            i++;
        }

        // 設定左子樹和右子樹。
        // 左子樹在 preorder 中從根節點後一個數開始(我們只需要這個索引,因為我們只需在 preorder 陣列中找到根節點的值)。在 inorder 中左子樹從 inSt 到 i - 1 結束。
        // 右子樹在 preorder 中從左子樹結束後的位置開始,為了找到這個索引,我們要根據 inorder 陣列計算左子樹長度,為 (i - inSt)。在 inorder 中右子樹從 i + 1 到 inEnd 結束。
        head.left = helper(preorder, inorder, preSt + 1, inSt, i - 1);
        head.right = helper(preorder, inorder, preSt + (i - inSt) + 1, i + 1, inEnd);

        return head;
    }
}
複雜度分析
  • 時間複雜度
    • O(n)
  • 空間複雜度
    • O(n)
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章