题目难度: 中等
原题链接
今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~
实现一个函数,检查一棵二叉树是否为二叉搜索树。
2
/ \
1 3
5
/ \
1 4
/ \
3 6
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
# 方法1: 加入上下界递归判断
def check(node, mn, mx):
# mn和mx表示当前子树的上下界取值范围, 即子树内的所有节点的值都要在(mn, mx)之间
if not node:
return True
if not mn < node.val < mx:
# 当前节点不属于该范围内, 说明不是合法的二叉搜索树
return False
# 检查左右子树, 注意上下界也要更新
# 即左子树的mx和右子树的mn要更新为当前节点值
return check(node.left, mn, node.val) & check(
node.right, node.val, mx)
# 初始化的上下界自然是-inf和+inf
return check(root, -float('inf'), float('inf'))
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
# 方法2: 中序遍历, 引入额外参数pre表示上一个元素的值
pre = -float('inf')
valid = True
def inorder(node):
nonlocal pre
nonlocal valid
if not node or not valid:
# 如果节点为空或者已经不是合法二叉搜索树了, 直接退出
return
inorder(node.left)
if pre >= node.val:
# 前一个值大于等于当前值, 不满足二叉搜索树的要求, 无效
valid = False
return
# 不要忘了更新前一个值为当前值, 用于下一次判断
pre = node.val
inorder(node.right)
inorder(root)
return valid
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~