思路:
二叉搜索树中序遍历结果是一个有序数组。利用此特性,可判断是否是一个正确的二叉搜索树。
递归法:
# 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:
sorted_list = []
def traversal(root: TreeNode) -> None:
if not root:
return
nonlocal sorted_list #nonlocal means 使用当前函数外层的函数内的变量,而不是
#重新新建一个新变量
traversal(root.left)
sorted_list.append(root.val)
traversal(root.right)
def isSortedList(ls: []) -> bool:
for i in range(1, len(ls)):
if ls[i] <= ls[i-1]:
return False
return True
traversal(root)
return isSortedList(sorted_list)
递归法(常规法:一边中序遍历,一边检查是否是有序):
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
cur_max = -float("INF")
def __isValidBST(root: TreeNode) -> bool:
if not root:
return True
nonlocal cur_max
left = __isValidBST(root.left)
if cur_max < root.val:
cur_max = root.val
else:
return False
right = __isValidBST(root.right)
return left and right
return __isValidBST(root)
虽然但是,如果测试数据中有-float("INF"),而cur_max也等于-float("INF"),就无法比较各节点之间的大小了。所以需要新方法,用一个pre变量记录下前一个root.val,将最底层最左边的节点作为第一个赋值给pre的root:
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
pre = None
def __isValidBST(root: TreeNode) -> bool:
if not root:
return True
nonlocal pre
left = __isValidBST(root.left)
#此时为了方便,可以从反面出发,即不满足条件返回false,满足就将记录当前root
if pre != None and pre.val >= root.val:
return False
pre = root
right = __isValidBST(root.right)
return left and right
return __isValidBST(root)