验证二叉搜索树
Recursive! Recursive! And Recursive!
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
-
The left subtree of a node contains only nodes with keys less than the node's key.
-
The right subtree of a node contains only nodes with keys greater than the node's key.
-
Both the left and right subtrees must also be binary search trees.
Example 1:
2 / \ 1 3 Input: [2,1,3] Output: true
Example 2:
5 / \ 1 4 / \ 3 6 Input: [5,1,4,null,null,3,6] Output: false Explanation: The root node's value is 5 but its right child's value is 4.
I can't solve that😅
主要是边界的问题一直没解决然后超时了。。。
Discussion
class Solution { public 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; if (!helper(node.right, val, upper)) return false; if (!helper(node.left, lower, val)) return false; return true; } public boolean isValidBST(TreeNode root) { return helper(root, null, null); } }
官方答案,很妙,但是凭空我是想不起来的。
//如果不用递归,而用栈实现前序: class Solution { Stack<TreeNode> st = new Stack<>(); Stack<Long> upperList = new Stack<>(), lowerList = new Stack<>(); public boolean isValidBST(TreeNode root) { long lower = Long.MIN_VALUE, upper = Long.MAX_VALUE, val; update(root, lower, upper); while (!st.empty()) { root = st.pop(); lower = lowerList.pop(); upper = upperList.pop(); if (root == null) continue; val = (long)root.val; if (val <= lower) return false; if (val >= upper) return false; update(root.right, val, upper); update(root.left, lower, val); } return true; } void update(TreeNode node, long lower, long upper) { st.push(node); lowerList.push(lower); upperList.push(upper); } }