98.验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路
中序遍历下,输出的二叉搜索树节点的数值是有序序列。有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
递归中序遍历 + 迭代中序遍历
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 注意二叉搜索树的特性 中序遍历是递增的 可以采用中序遍历之后判断是否是递增
class Solution():
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root:
return # 树为空 直接return
result = self.inorder(root)
for i in range(len(result)-1):
if result[i] >= result[i+1]: # 噢!可以等于
return False
return True
# 递归 中序遍历
# def inorder(self, root):
# if not root:
# return []
# left = self.inorder(root.left)
# right = self.inorder(root.right)
# return left + [root.val] + right
# 迭代 中序遍历
def inorder(self, root):
if not root:
return []
stack = []
result = [] # 存储结果
node = root
while node or stack:
# 一路向左
if node: # 外层有循环可以控制
stack.append(node)
node = node.left
else: # 到达最左 开始处理
node = stack.pop()
result.append(node.val)
node = node.right
return result