解法一
思路
中序遍歷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 協議》,轉載必須註明作者和本文連結