IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 98. 验证二叉搜索树 -> 正文阅读

[数据结构与算法]98. 验证二叉搜索树

98. 验证二叉搜索树

方法一:中序遍历

二叉搜索树(二叉排序树、二叉查找树)(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树;若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。

二叉搜索树中序遍历得到的序列一定是严格递增序列。

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:       
        def inorder(node):
            return inorder(node.left) + [node.val] + inorder(node.right) if node else []
        x = inorder(root)
        for i in range(1,len(x)):
            if x[i] <= x[i-1]:
                return False
        return True

方法二:中序遍历

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        stack, inorder = [], float('-inf')        
        while stack or root:
            while root:
                stack.append(root)
                root = root.left
                
            root = stack.pop()
            
            if root.val <= inorder:
                return False
            inorder = root.val
            
            root = root.right

        return True

方法三:递归

设计一个递归函数 h e l p e r ( r o o t , l o w e r , u p p e r ) helper(root, lower, upper) helper(root,lower,upper),表示以 r o o t root root 为根的子树,判断子树中所有节点的值是否都在开区间 ( l o w e r , u p p e r ) (lower,upper) (lower,upper) 内。

如果 r o o t root root 节点的值 v a l val val 不在 ( l o w e r , u p p e r ) (lower,upper) (lower,upper) 内直接返回 False,否则继续递归调用检查它的左右子树是否满足,如果都满足才说明这是一棵二叉搜索树。

根据二叉搜索树的性质,在递归调用左子树时,把上界 u p p e r upper upper 改为 r o o t . v a l root.val root.val,即调用 h e l p e r ( r o o t . l e f t , l o w e r , r o o t . v a l ) helper(root.left, lower, root.val) helper(root.left,lower,root.val)。递归调用右子树时,把下界 l o w e r lower lower 改为 r o o t . v a l root.val root.val,即调用 h e l p e r ( r o o t . r i g h t , r o o t . v a l , u p p e r ) helper(root.right, root.val, upper) helper(root.right,root.val,upper)

函数递归调用的入口为 h e l p e r ( r o o t , ? i n f , + i n f ) helper(root, -inf, +inf) helper(root,?inf,+inf)

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        def helper(node, lower = float('-inf'), upper = float('inf')) -> bool:
            if not node: return True            
            val = node.val
            if val <= lower or val >= upper: return False
            if not helper(node.right, val, upper): return False
            if not helper(node.left, lower, val): return False
            return True

        return helper(root)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:10:49  更:2021-09-01 12:11:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:22:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码