98. 验证二叉搜索树

原题

https://leetcode.cn/problems/validate-binary-search-tree/description/

思路

递归

复杂度

时间:O(n)
空间:O(n)

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 isBST(root, left = float('-inf'), right = float('inf')):
            if not root:
                return True 
            if left >= root.val or right <= root.val:
                return False 
            if not isBST(root.left, left, root.val):
                return False 
            if not isBST(root.right, root.val, right):
                return False 
            return True 

        return isBST(root)

Go代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isValidBST(root *TreeNode) bool {
	// 匿名函数
	var isBST func(*TreeNode, int, int) bool
	isBST = func(root *TreeNode, left int, right int) bool {
		if root == nil {
			return true
		}
		if left >= root.Val || right <= root.Val {
			return false
		}
		if isBST(root.Left, left, root.Val) == false {
			return false
		}
		if isBST(root.Right, root.Val, right) == false {
			return false
		}
		return true
	}
	return isBST(root, math.MinInt32-1, math.MaxInt32+1)
}
### 如何验证一个二叉树是否为二叉搜索树 为了验证给定的二叉树是否为二叉搜索树(Binary Search Tree, BST),可以利用二叉搜索树的关键性质:对于任意节点 `node`,其左子树的所有节点值都小于该节点值,右子树的所有节点值都大于该节点值。 以下是两种常见的方法: #### 方法一:基于中序遍历的方法 通过中序遍历二叉树,如果是一棵合法的二叉搜索树,则会得到一个严格递增的数值序列。具体实现如下: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isValidBST(root: TreeNode) -> bool: stack, prev_val = [], float('-inf') while root or stack: while root: stack.append(root) root = root.left node = stack.pop() # 如果当前节点值不大于前驱节点值,则不是有效BST if node.val <= prev_val: return False prev_val = node.val root = node.right return True ``` 这种方法的核心在于维护一个变量 `prev_val` 来记录上一次访问的节点值,并确保每次新访问的节点值都要比它大[^2]。 #### 方法二:基于上下界范围的方法 另一种方式是从根节点开始递归地检查每个节点是否满足二叉搜索树的定义条件——即它的值应在某个范围内。初始时整个树的根节点应位于负无穷到正无穷之间;随后每进入左子树则更新上限,进入右子树则更新下限。 ```python def helper(node, lower=float('-inf'), upper=float('inf')): if not node: return True val = node.val if val <= lower or val >= upper: return False if not helper(node.right, val, upper): # 右子树需满足更大的最小值 return False if not helper(node.left, lower, val): # 左子树需满足更小的最大值 return False return True def isValidBST(root: TreeNode) -> bool: return helper(root) ``` 此方法的优点是可以提前终止不必要的后续计算,在某些情况下效率更高[^1]。 以上两种方法均能有效地判定一棵二叉树是否符合二叉搜索树的要求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值