力扣刷题-二叉树-验证二叉搜索树

98.验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

image.png

思路

中序遍历下,输出的二叉搜索树节点的数值是有序序列。有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

递归中序遍历 + 迭代中序遍历

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值