1、题目描述
https://leetcode-cn.com/problems/validate-binary-search-tree/
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
2、代码详解
中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST,继续遍历;否则直接返回 false。
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
self.prev = float('-inf') # 用一个比树中所有节点可能的值都小的值去初始化prev
return self.inOrder(root)
def inOrder(self, node):
if not node:
return True
# 访问左子树
if not self.inOrder(node.left):
return False # 左子树都不满足的话就不需要继续判断了
# 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历
if node.val <= self.prev:
return False
self.prev = node.val # 更新prev为当前节点
# 访问右子树
return self.inOrder(node.right)
法二(不推荐):比中序遍历完整棵树后,在判断是否升序更快更省 ,即判断 inorder == list(sorted(set(inorder))