上来我就是只考虑了相邻节点之间的关系:
其实从左<根<右的提示就应该想到中序遍历,假如是搜索二叉树的话,中序遍历得到的结果就应该是绝对升序的列表。在遍历的过程中有降序的节点就判断不是搜索二叉树。
# 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
stack = []
pre = float("-inf")
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
# 中序遍历的时候 栈里元素弹出的时操作
# 判断是否逆序
if root.val<=pre:
return False
else:
pre = root.val
root = root.right
return True
也可以用中序遍历的递归方式来解决
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
# 用这个属性保存当前节点的数值
self.pre = None
def isValidBST(self, root: TreeNode) -> bool:
if not root:
return True
if root:
left = self.isValidBST(root.left)
# 这个地方的root是和递归遍历一直变化的
if self.pre==None:
self.pre =root.val
elif self.pre<root.val:
self.pre =root.val
else:
return False
right = self.isValidBST(root.right)
return left and right