2023-12-18 最大二叉树、合并二叉树、二叉搜索树中的搜索、验证二叉搜索树

654. 最大二叉树

654.最大二叉树

核心:记住递归三部曲,一般传入的参数的都是题目给好的了!把构造树类似于前序遍历一样就可!就是注意单层递归的逻辑!
# 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 constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        # 递归三部曲
        if not nums:
            return 
        max_ = max(nums)
        max_index = nums.index(max_)
        root = TreeNode(max_)
        root.left = self.constructMaximumBinaryTree(nums[:max_index])
        root.right = self.constructMaximumBinaryTree(nums[max_index + 1:])
        return root
     def constructMaximumBinaryTree2(self, nums: List[int]) -> Optional[TreeNode]:
        # 递归的三部曲 1.确定参数以及返回值--传入数组,输出节点 2.结束递归条件--如果数组len==1说明遍历到叶子节点了 3.单层逻辑--找到最大值以及最大值的下标
        if len(nums) == 1:
            return TreeNode(nums[0]) 
        node = TreeNode(0)
        max_numb = 0
        max_index = 0  
        for i in range(len(nums)):
            if nums[i] > max_numb:
                max_index = i
                max_numb = nums[i]
        node.val = max_numb
        # 判断下标值是否大于0 说明是否有左子树
        if max_index > 0:
            new_list = nums[:max_index]
            node.left = self.constructMaximumBinaryTree(new_list)
        if max_index < len(nums) - 1:
            new_list = nums[max_index + 1:]
            node.right = self.constructMaximumBinaryTree(new_list)
        return node
        

617. 合并二叉树

617.合并二叉树

思路:以建立的节点为标准,类似于前缀【中后序】遍历进行构造!或者使用迭代法【建立两个队列进行维护就好了】
# 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 mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        # 终止条件:但凡有一个节点为空,就返回另一个节点,如果另一个也为None就直接返回None
        # 以创建的新节点为移动标准
        if not root1:
            return root2
        if not root2:
            return root1
        node  = TreeNode()
        node.val = root1.val + root2.val
        node.left = self.mergeTrees(root1.left, root2.left)
        node.right = self.mergeTrees(root1.right, root2.right)
        return node

    def mergeTrees1(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1 and not root2:
            return 
        node = TreeNode(0)
        if root1 and root2:
            node.val = root1.val + root2.val
            node.left = self.mergeTrees(root1.left,root2.left)
            node.right = self.mergeTrees(root1.right, root2.right)
        elif root1 and not root2:
            node.val = root1.val
            node.left = self.mergeTrees(root1.left,None)
            node.right = self.mergeTrees(root1.right,None)
        else:
            node.val = root2.val
            node.left = self.mergeTrees(None,root2.left)
            node.right = self.mergeTrees(None,root2.right)
        return node
        

700. 二叉搜索树中的搜索

思想:使用层次遍历或者使用递归或迭代

二叉搜索树

# 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 searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        queue_1 = []
        if not root:
            # return queue_1.append(root) 犯下了致命弱智的错误
            return None
        queue_1.append(root)
        while len(queue_1) > 0:
            node = queue_1.pop(0)
            if node.val == val:
                return node
            if node.left:
                queue_1.append(node.left)
            if node.right:
                queue_1.append(node.right)
        return None
    # 迭代法
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        while root:
            if root.val > val:
                root = root.left
            elif root.val < val:
                root = root.right
            else:
                return root
        return None
    # 递归法
    def searchBST(self, root: TreeNode, val: int) -> TreeNode:
        # 为什么要有返回值: 
        #   因为搜索到目标节点就要立即return,
        #   这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。

        if not root or root.val == val: 
            return root

        if root.val > val: 
            return self.searchBST(root.left, val)

        if root.val < val: 
            return self.searchBST(root.right, val)

            
        

98. 验证二叉搜索树

核心:理解中序遍历的规则,在二叉树中中序遍历出来的结果一定是有序的!

在这里插入图片描述

# 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 __init__(self):
        self.nums = []
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        # 中序遍历出来的数一定是有序的
        self.nums = []  # 清空数组
        self.traversal(root)
        for i in range(1, len(self.nums)):
            # 注意要小于等于,搜索树里不能有相同元素
            if self.nums[i] <= self.nums[i - 1]:
                return False
        return True
    def traversal(self, root):
        if root is None:
            return
        self.traversal(root.left)
        self.nums.append(root.val)  # 将二叉搜索树转换为有序数组
        self.traversal(root.right)
        
# 设置最小值比较,就可以修改了单层逻辑那个地方,左了一个比较!
class Solution:
    def __init__(self):
        self.maxVal = float('-inf')  # 因为后台测试数据中有int最小值

    def isValidBST(self, root):
        if root is None:
            return True

        left = self.isValidBST(root.left)
        # 中序遍历,验证遍历的元素是不是从小到大
        if self.maxVal < root.val:
            self.maxVal = root.val
        else:
            return False
        right = self.isValidBST(root.right)

        return left and right

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/256383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm高校宿舍管理系统的设计与开发论文

摘 要 本文是对高校宿舍管理系统的概括总结&#xff0c;主要从开题背景&#xff0c;课题意义&#xff0c;研究内容&#xff0c;开发环境与技术&#xff0c;系统分析&#xff0c;系统设计&#xff0c;系统实现这几个角度来进行本高校宿舍管理系统的阐述。 高校宿舍管理系统运用…

基于深度学习的图像去雾系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着计算机视觉和图像处理技术的不断发展&#xff0c;图像去雾成为了一个备受关注的研究领域。在自然环境中&#xff0c;由于大气中的颗粒物和水汽的…

vs code 如何配置配置自动编译将TypeScript代码编译成为JavaScript代码看这一篇就够了!!!

TS代码自动编译为JS代码 1. 检查是否有node环境2. 执行 tsc命令3. 监控编译 总结 本文介绍了vs code如何配置自动编译&#xff0c;将TypeScript代码编译成为JavaScript代码。 1. 检查是否有node环境 检查系统是否有node环境&#xff0c;命令如下 node -v npm -v如果没有安装…

ControlNet Adding Conditional Control to Text-to-Image Diffusion Models

ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models TL; DR&#xff1a;ControlNet 使得我们能通过输入额外的条件图&#xff08;如 Canny 边缘、人体姿态、深度图等&#xff09;&#xff0c;对 SD 生成结果的空间位置有更准确的控制。它拷贝 SD 部分…

DiffUtil + RecyclerView 在 Kotlin中的使用

很惭愧, 做了多年的Android开发还没有使用过DiffUtil这样解放双手的工具。 文章目录 1 DiffUtil 用来解决什么问题?2 DiffUtil 是什么?3 DiffUtil的使用4 参考文章 1 DiffUtil 用来解决什么问题? 先举几个实际开发中的例子帮助我们感受下: 加载内容流时,第一次加载了ABC,…

idea添加外部jar包

在日常开发中在lib包的里面添加了外部的jar&#xff0c;如何将外部的包添加到java类库中&#xff0c;这样项目就可以引用相应的jar包&#xff0c;操作如下&#xff1a; 1.先将需要的jar复制到lib包如下&#xff0c;如下截图&#xff0c;图标前面没有箭头&#xff0c;表示还未添…

2024年【北京市安全员-B证】考试报名及北京市安全员-B证考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-B证考试报名参考答案及北京市安全员-B证考试试题解析是安全生产模拟考试一点通题库老师及北京市安全员-B证操作证已考过的学员汇总&#xff0c;相对有效帮助北京市安全员-B证考试技巧学员顺利通过考试。…

sqlserver-事物日志

文章目录 前言事务日志逻辑体系结构事务日志物理体系结构虚拟日志文件 (VLF)事务日志的循环性质日志截断事务日志备份事务日志支持的操作恢复个别的事务。启动事务时恢复所有未完成SQL Server事务。将还原的数据库、文件、文件组或页前滚至故障点。支持事务复制。支持高可用性和…

利用gradio快速搭建AI应用

引言 Gradio 是一个用于快速创建交互式界面的Python库&#xff0c;这些界面可以用于演示和测试机器学习模型。使用Gradio&#xff0c;开发者可以非常轻松地为他们的模型构建一个前端界面&#xff0c;而不需要任何Web开发经验。 与类似产品的对比 TensorBoard&#xff1a;主…

Java-04方法

1、什么是方法 设计方法的原则&#xff1a;方法的本意是功能块&#xff0c;就是实现某个功能的语句块的集合。我们设计方法的时候&#xff0c;最好保持方法的原子性&#xff0c;就是一个方法只完成一个功能&#xff0c;这样有利于我们后期的扩展。 2、方法的定义 修饰符 返回…

用23种设计模式打造一个cocos creator的游戏框架----(二十)解析器模式

1、模式标准 模式名称&#xff1a;解析器模式 模式分类&#xff1a;行为型 模式意图&#xff1a;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 结构图&#xff1a; 适用于&#xff1…

interface接口(学习推荐版)

接口组成部分 示例代码&#xff1a; 1.默认会在类型前面添加public staic final修饰变量&#xff0c;所以可省略 2.默认在方法前面添加public abstract修饰&#xff0c;但没有staic和final修饰 注意事项&#xff1a; 1、用staic final的变量就是常量 2、接口只能由成员变量&a…

Day03

13.约束constraint 13.1 概述 13.1.1 背景 数据完整性&#xff08;Data Integrity)是指数据的精确性&#xff08;Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。 为了保证数据的完…

众和策略:如何稳健投资股票?

怎么稳健出资股票&#xff1f;下降股票亏本概率的办法&#xff01; 1、长时间坚持 股票商场的动摇是非常大的&#xff0c;特别是短期内呈现的改变&#xff0c;假如不是短线出资者的话&#xff0c;那么建议长时间出资较为稳健&#xff0c;长时间出资能够协助出资者躲避商场动摇…

微信小程序校园跑腿系统怎么做,如何做,要做多久

​ 在这个互联网快速发展、信息爆炸的时代&#xff0c;人人都离不开手机&#xff0c;每个人都忙于各种各样的事情&#xff0c;大学生也一样&#xff0c;有忙于学习&#xff0c;忙于考研&#xff0c;忙着赚学分&#xff0c;忙于参加社团&#xff0c;当然也有忙于打游戏的&#x…

【MySQL】:复合查询

复合查询 一.多表查询二.自连接三.子查询1.单行子查询2.多行子查询3.多列子查询4.在from语句里使用子查询5.合并查询 准备三张表 emp表 dept表 salgrade表 一.多表查询 实际开发中往往数据来自不同的表&#xff0c;所以需要多表查询。我们用一个简单的公司管理系统&#xff0c…

欧非源国际交易平台在2023中非经济贸易大湾区论坛首次亮相

12月16日&#xff0c;2023中非经济贸易大湾区论坛在鹏城隆重召开&#xff0c;欧非源国际交易平台首次亮相。来自非洲部分国家的驻华使节、中非经济贸易委员会领导以及商&#xff08;协&#xff09;会、企业家代表共同见证了欧非源国际交易平台的发布&#xff0c;亲历了该平台与…

Pycharm enable IntelliBot #patched后,工程无法打开

#本地环境# Pycharm&#xff1a;2023.12 Pro 对应robot pkg版本&#xff1a; robotframework 6.1 robotframework-databaselibrary 1.2.4 robotframework-pythonlibcore 4.1.2 robotframework-requests 0.9.4 robotframework-seleniumlibrary 6.1.…

内衣洗衣机好用吗?专门洗内衣内裤的热门小型洗衣机

随着人们的生活水平的提升&#xff0c;越来越多小伙伴来开始追求更高的生活水平&#xff0c;一些智能化的小家电就被发明出来&#xff0c;而且内衣洗衣机是其中一个。现在通过内衣裤感染到细菌真的是越来越多&#xff0c;所以我们对内衣裤的清洗频次会高于普通衣服&#xff0c;…

RFID产线物料、人员自动识别管理设计应用方案

生产过程控制的要求是根据在制品信息&#xff0c;动态地确定在制品组装路线和组装方式&#xff0c;使企业管理层能够实时地发现在制品生产和生产线运转状态&#xff0c;系统主要由流水线、RFID 数据采集系统、在制品和工位几个部分组成。 当在制品在流水线上移动时&#xff0c…