一、刷题内容
原题链接
https://leetcode-cn.com/problems/validate-binary-search-tree/
内容描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
二、解题方案
1.方法一:中序遍历
根据二叉搜索树的性质,中序遍历后的结果是升序的。时间复杂度O(n),不过空间复杂度不理想
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def isValidBST(self, root) -> bool:
# 如果是二叉搜索树, 中序遍历后的结果应该是升序的
temp = self.inorder_traversal(root)
return temp == list(sorted(set(temp)))
def inorder_traversal(self, root):
# LDR中序遍历, 左中右
if root is None:
return []
return self.inorder_traversal(root.left) + [root.val] + self.inorder_traversal(root.right)
2.方法二:递归
其实只要记住一个前驱节点,中序遍历到中的时候判断前驱节点是否大于root,大于就错误
class Solution:
def isValidBST(self, root) -> bool:
# 如果是二叉搜索树, 中序遍历后的结果应该是升序的
self.prev = None
return self.helper(root)
def helper(self, root):
if root is None: # 空二叉搜索树也是对的
return True
if not self.helper(root.left):
return False
if self.prev and self.prev.val >= root.val:
return False
self.prev = root
return self.helper(root.right)
3.方法三:递归
比较当前节点和其上下限,递归过程中更新其上下限。
class Solution:
def isValidBST(self, root) -> bool:
# python中使用下面分别表示 负无穷和正无穷
return self.helper(root, float('-inf'), float('inf'))
def helper(self, node, lower, upper):
if not node:
return True
if lower < node.val < upper:
# 需要更新上下限
return self.helper(node.left, lower, node.val) and self.helper(node.right, node.val, upper)
return False
这篇博客介绍了如何验证一个二叉树是否为有效的二叉搜索树,提供了三种解题方案:中序遍历、递归以及递归更新上下限。每种方法都详细解释了实现思路,并给出了Python代码实现。

被折叠的 条评论
为什么被折叠?



