
解法
递归解法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return dfs(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
/**
* 递归遍历,判断每个节点是否符合范围
*/
private boolean dfs(TreeNode node, long floor, long ceil) {
if (node == null) {
return true;
}
int val = node.val;
if (val <= floor || val >= ceil) {
return false;
}
// 左节点小于当前节点的值
// 右节点大于当前节点的值
return dfs(node.left, floor, val) && dfs(node.right, val, ceil);
}
}
迭代解法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
long pre = Long.MIN_VALUE;
Stack<TreeNode> s = new Stack<>();
// 中序遍历,当前遍历节点大于之前访问到节点的值
while (!s.isEmpty() || root != null) {
while (root != null) {
s.push(root);
root = root.left;
}
TreeNode node = s.pop();
if (node.val <= pre) {
return false;
}
pre = node.val;
root = node.right;
}
return true;
}
}
网友评论