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