题目
验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树
作者:力扣 (LeetCode)
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xn08xg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题解
方法一:递归
思路:
每次判断的当前节点(判断当前节点是否为空就可以了) 的左节点 只要比最小值大比根节点值小 并且 右节点只要比最大值小 根节点值大 就行。
java解
/**
* 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){
if(node == null){
return true;
}
if(node.val<=lower || node.val>=upper){
return false;
}
return isValidBST(node.left,lower,node.val) && isValidBST(node.right,node.val,upper);
}
}
python解
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
def BFS(root,left,right) ->bool:
if root is None:
return True
if left<root.val <right:
return BFS(root.left, left, root.val) and BFS(root.right, root.val,right)
else:
return False
return BFS(root,-float('inf'),float('inf'))
方法二 中序遍历
java解
/**
* 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) {
// 中序遍历
// 定义一个双端队列
Deque<TreeNode> stack = new LinkedList<TreeNode>();
// 最小值
double inorder = -Double.MAX_VALUE;
// 遍历整棵树
while(!stack.isEmpty()||root!=null){
while(root!=null){
stack.push(root);
root = root.left;
}
root = stack.pop();
if(root.val<=inorder){
return false;
}
inorder = root.val;
root = root.right;
}
return true;
}
}