LeetCode 98. Validate Binary Search Tree

Borris發表於2020-02-11

解法一

思路

中序遍歷BST可以得到有序陣列,所以如果遍歷時前一個數比後一個數大的話,就不是 valid 了。

程式碼
class Solution {
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode curr = root;
        TreeNode prev = null;

        // Do an inorder traversal
        while (curr != null || !stack.isEmpty()) {
            while (curr != null) {
                stack.push(curr);
                curr = curr.left;
            }

            curr = stack.pop();
            if (prev != null && prev.val >= curr.val) {
                return false;
            }
            prev = curr;
            curr = curr.right;
        }
        return true;
    }
}
複雜度分析
  • 時間複雜度
    • 遍歷一遍二叉樹,花費 O(n) 時間
  • 空間複雜度
    • O(N) – Stack

解法二

思路

寫一個 helper function, 先檢查該結點是否比 upper bound 小,以及比 lower bound 大;然後遞迴呼叫檢查其左子樹和右子樹。

程式碼
class Solution {
    public boolean isValidBST(TreeNode root) {
        return helper(root, null, null);
    }

    private boolean helper(TreeNode node, Integer lower, Integer upper) {
        if (node == null) return true;
        int val = node.val;
        if (lower != null && val <= lower) return false;
        if (upper != null && val >= upper) return false;

        // recursively check left and right subtree
        if (!helper(node.left, lower, val)) return false;
        if (!helper(node.right, val, upper)) return false;

        return true;
    }
}
複雜度分析
  • 時間複雜度
    • O(n)
  • 空間複雜度
    • O(n)

Takeaway

由於是 BST,必須保證每一個節點的所有左孩子比它小,右孩子比它大。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章