力扣日刷47

98.验证二叉搜索树

前序遍历的方法:设置左右的边界判断值,不断更新左右的边界,最后实现。先结点再左右

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode],left = -inf, right = inf) -> bool:
        if root == None:
            return True
        
        return left<root.val<right and self.isValidBST(root = root.left ,left=left ,right=root.val) and self.isValidBST(root=root.right,left = root.val, right = right)
        

中序遍历的方法:先左再中最后右。先左到底,这样的话我们就能得到最小的那个值,然后开始返回来跟下一个结点值进行比较,如果确实前项结点值小于后项结点值,我们就可以返回True,不然就返回false,或者只去判断返回false,当所有节点都不返回False的时候就返回True就好了。

下面是相关的代码

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    pre =-inf
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        
        if root == None:
            return True
        if not self.isValidBST(root.left):
            return False
        if root.val <= self.pre:
            return False
        self.pre = root.val
        return self.isValidBST(root.right)

下面这个是后序的排列,讲真这个递归有点复杂,他是一个反向汇报,最后我们判断结果的一个过程。其中迭代的逻辑是这样的,我们需要返回的是一个边界情况,当前节点值的通过比对左右的内容来更新判断。如果inf就越界了。这题我还真没有完全掌握nnd,它保存了两个左右边界的信息,然后当当前节点不在左右边界夹住的范围的时候我们返回一个报错inf。当当前节点在夹住的时候,我们需要去更新左边的最小值l_min与右边的最大值。这里是在将两颗子树打包合成一颗子树,把两边的内容拿过来,真是有点烧脑啊

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        def f(node):
            if node is None:
                return inf, -inf 
            l_min , l_max = f(node.left)
            r_min , r_max = f(node.right)
            
            if node.val >=r_min or node.val <= l_max:
                return -inf,inf
            return min(l_min,node.val),max(r_max,node.val)
        return f(root)[1] != inf
相关推荐
wuyk5554 小时前
21.计数排序:不用比较的“空间换时间”排序算法
python·算法·排序算法
Rabitebla4 小时前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
顶点多余4 小时前
9.20 知识点查漏补缺
linux·面试·职场和发展
库玛西4 小时前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
木井巳4 小时前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
东方护航数据恢复(深圳)4 小时前
本地小算力设备数据恢复经典案例实操全解_东方护航数据恢复深圳店
大数据·服务器·算法·ai·gpu算力
Omics Pro4 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
Y幽谷客4 小时前
图像识别入门习题整理
算法
点纭4 小时前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#
β添砖java5 小时前
机器学习2 KNN算法、距离度量、特征预处理、超参数选择、手写数字、鸢尾花
人工智能·算法·机器学习