<LeetCode天梯>Day031 验证二叉搜索树(递归+中序遍历) | 初级算法 | Python

简介: <LeetCode天梯>Day031 验证二叉搜索树(递归+中序遍历) | 初级算法 | Python

以下为我的天梯积分规则:


每日至少一题:一题积分+10分

若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)

若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)


初始分为100分

若差一天没做题,则扣积分-10分(周六、周日除外注:休息)

坚持!!!


初级算法

刷题目录

链表

image.png

题干

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树

有效 二叉搜索树定义如下:

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

示例 1:

image.png

输入:root = [2,1,3]

输出:true

示例2:

image.png

输入:root = [5,1,4,null,null,3,6]

输出:false

解释:根节点的值是 5 ,但是右子节点的值是 4 。


提示:


树中节点数目范围在[1, 10^4] 内

-2^31 <= Node.val <= 2^31 - 1

中序遍历

分析:


可能由读者不知道中序遍历是什么,我们这里简单提及一下,中序遍历是二叉树的一种遍历方式,它先遍历左子树,再遍历根节点,最后遍历右子树。而我们二叉搜索树保证了左子树的节点的值均小于根节点的值,根节点的值均小于右子树的值,因此中序遍历以后得到的序列一定是升序序列。(引用自了力扣原始解释,这个解释很通透!)

image.png

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
      if not root:
            return True
        prev = None 
        stack = []
        while stack or root:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            # 若中序遍历得到的节点的值小于前一个值prev,那么就说明不是二叉搜索树,返回False
            if prev and root.val <= prev.val:
                return False
                # 保存上一节点
            prev = root
            root = root.right
        return True

这个速度超级快,超过100%!!!

image.png

思路很不错!!!多多练习

二叉树搜索(递归)

有大佬分析的很透彻,来看下面的图

image.png

注意6这个节点不光要小于15而且还要大于10,所以这里的每一个节点都是有一个范围的。这里我们来给每个节点添加一个范围,如果不在这个范围之内直接返回false,比如6的范围是(10,15),很明显他不在这个范围内,所以他不是二叉搜索树。下面方法可能不完全按照上面解释一致。

class Solution:
    prev = None  # 用于记录前一个节点
    def isValidBST(self, root: TreeNode) -> bool:
        if not root:
            return True
        # 从左开始递归
        if not self.isValidBST(root.left):
            return False
        # 判断前一节点是否大于当前
        if self.prev is not None and self.prev.val >= root.val:
            return False
        # 保存前个节点
        self.prev = root
        # 右边递归
        if not self.isValidBST(root.right):
            return False
        return True

image.png

增加上下界的写法:

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
    # 递归并引入上界,下界来判断是否有效的二叉搜索树
    def chesh(node, min_val = float('-inf'), max_val = float('inf')) -> bool:
            if not node:
                return True
            #每个节点如果超过这个范围,直接返回false,设置出口
            if node.val <= min_val or node.val >= max_val:
                return False
            #这里再分别以左右两个子节点分别判断
            #左子树范围的最小值是minVal,最大值是当前节点的值,也就是root的值,因为左子树的值要比当前节点小   
            #右子数范围的最大值是maxVal,最小值是当前节点的值,也就是root的值,因为右子树的值要比当前节点大
            return chesh(node.left, min_val, node.val) and chesh(node.right, node.val, max_val)
        return chesh(root)

复现大佬的Java代码。

image.png


相关文章
|
25天前
|
存储 算法 程序员
数据结构与算法===递归
数据结构与算法===递归
|
17天前
|
存储 算法 搜索推荐
力扣每日一题 6/13 反悔贪心算法
力扣每日一题 6/13 反悔贪心算法
10 1
|
1月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
34 7
|
5天前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
|
5天前
|
存储 算法 索引
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
|
28天前
|
算法 Java
[Java·算法·简单] LeetCode 283. 移动零
[Java·算法·简单] LeetCode 283. 移动零
23 2
|
1月前
|
存储 算法 调度
力扣中级算法(Python)
力扣中级算法(Python)
|
1月前
|
算法 Python
力扣初级算法(Python)(二)
力扣初级算法(Python)(二)
|
1月前
二刷力扣--二叉树(1)基础、遍历
二刷力扣--二叉树(1)基础、遍历
|
28天前
|
机器学习/深度学习 存储 算法
算法学习:递归
算法学习:递归
19 0