给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
解1 递归
- 需要注意的是:根节点的左子树的所有节点都要小于根节点;根节点的右子树的所有节点的值都要大于根节点,因此递归是不能只判断当前节点与其左节点和右节点
- 解决办法:递归每个节点时,带入其上下区间,递归左右孩子时更新上下区间
# 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: TreeNode) -> bool:
return self.dfs(root, float('-inf'), float('inf'))
def dfs(self, node, min_t, max_t):
if not node:
return True
# 当前节点的val是否在区间内
mid = node.val > min_t and node.val < max_t
# 左子树的所有节点的val是否在区间内
left = self.dfs(node.left, min_t, node.val)
# 右子树的所有节点的val是否在区间内
right = self.dfs(node.right, node.val, max_t)
return mid and left and right
同理
# 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: TreeNode) -> bool:
return self.dfs(root, None, None)
def dfs(self, node, left, right):
if not node:
return True
# 当前节点的val是否在区间内
if left and node.val <= left.val:
return False
if right and node.val >= right.val:
return False
# 左子树的所有节点的val是否在区间内
left = self.dfs(node.left, left, node)
# 右子树的所有节点的val是否在区间内
right = self.dfs(node.right, node, right)
return left and right
解2 中序遍历
中序遍历:左 根 右
刚好是一个有序数组
# 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: TreeNode) -> bool:
if not root:
return True
l = list()
self.dfs(root, l)
n = len(l)
for i in range(n-1):
if l[i].val >= l[i+1].val:
return False
return True
def dfs(self, node, l):
if node.left:
self.dfs(node.left, l)
l.append(node)
if node.right:
self.dfs(node.right, l)