## 题目
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
注意:
- 树中节点数目范围在
[1, 10^4]
内 -2^31 <= Node.val <= 2^31 - 1
解题
方法一:递归
思路
如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也为二叉搜索树。
使用两个变量记录当前节点合法时的最小边界(minBound
)和最大边界(maxBound
),则
$rootVal\in[-2^{31}, 2^{31}-1]$
$rLVal\in[-2^{31}, rootVal)$ $rRVal\in(rootVal, 2^{31}-1]$
$rLLVal\in[-2^{31}, rLVal)$ $rLRVal\in(rLVal, rootVal)$
$rRLVal\in(rootVal, rRVal)$ $rRRVal\in(rRVal, 2^{31}-1]$
代码
/**
* 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 isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode node, long minBound, long maxBound) {
if (node == null) {
return true;
}
if (node.val <= minBound || node.val >= maxBound) {
return false;
}
return isValidBST(node.left, minBound, node.val) &&
isValidBST(node.right, node.val, maxBound);
}
}
方法二:中序遍历
思路
中序遍历 BST 一定是真升序的,如果遍历到当前节点值 $\le$ 前一个节点值为不是 BST。
代码
迭代
/**
* 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) {
Stack<TreeNode> nodeStack = new Stack<>();
long prevVal = Long.MIN_VALUE;
while(!nodeStack.isEmpty() || root != null) {
while (root != null) {
nodeStack.push(root);
root = root.left;
}
root = nodeStack.pop();
if (root.val <= prevVal) {
return false;
}
prevVal = root.val;
root = root.right;
}
return true;
}
}
递归
/**
* 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 long preVal = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
if (!isValidBST(root.left) || root.val <= preVal) {
return false;
}
preVal = root.val;
return isValidBST(root.right);
}
}
评论区