验证二叉搜索树
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/validate-binary-search-tree
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
点击查看代码
//递归
/**
* 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 lower,long upper){
//判断当前的节点是否为 null 说明二叉树递归完了返回 true
if(node == null){
return true;
}
//判断当前节点的值是否满足条件 为左子节点 大于lower 小于根节点值;为右子节点 大于根节点 小于 upper
if(node.val <= lower || node.val >= upper){
return false;
}
//递归,传入为当前节点的左子节点时,需要小于根节点,大于长整型最小值,
// 传入为当前节点的右子节点时,需要大于根节点,小于长整型最大值。
return isValidBST(node.left,lower,node.val) && isValidBST(node.right,node.val,upper);
}
}
//中序遍历
class Solution {
public boolean isValidBST(TreeNode root) {
//定义一个栈,存储各个子节点
Deque<TreeNode> stack = new LinkedList<TreeNode>();
//定义一个数存储 inorder 值 为初始节点的 inorder 值
double inorder = -Double.MAX_VALUE;
//迭代,直到栈为空或者节点为 null 时
while(!stack.isEmpty() || root != null){
//当节点不为空 迭代将当前节点与所有左子节点入栈
while(root != null){
//将当前节点入栈
stack.push(root);
//当前节点变为节点的左子节点
root = root.left;
}
//节点为空,将节点出栈
root = stack.pop();
//如果中序遍历得到的节点值小于等于前一个 inorder,说明非二叉搜索树
if(root.val <= inorder){
return false;
}
//左子节点要始终小于父节点值 inorder 值变为当前节点值
inorder = root.val;
//当前节点变为右子节点
root = root.right;
}
//遍历结束,返回 true
return true;
}
}
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
错误版本
public boolean isValidBST(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int index = 1;
Map<Integer,List<Integer>> nodes = new HashMap<>();
while(queue.size()>0){
List<Integer> list = new ArrayList<>();
int size = queue.size();
for(int i = 0;i<size;i++){
TreeNode tmp = queue.get(i);
list.add(tmp);
if(i == 1 && tmp.val > nodes.get(index).get(i)){
return false;
}
else if(i == 2 && tmp.val <nodes.get(index).get(i)){
return false;
}
if(tmp.left != null){
queue.add(tmp.left);
}
if(tmp.right != null){
queue.add(tmp.right);
}
}
nodes.add(index,tmp);
}
return true;
}