leetcode刷题-二叉树05

news2024/11/23 21:35:31

代码随想录二叉树part05|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

    • 654.最大二叉树
      • 一遍过,不过貌似有多种解法,后序再补充
    • 617.合并二叉树
    • 700.二叉搜索树中的搜索
    • 98.验证二叉搜索树
      • 看其他解题方法

654.最大二叉树

代码随想录文档讲解
LeetCode

一遍过,不过貌似有多种解法,后序再补充

伪代码c++


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 constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        if len(nums) == 0:
            return None
        maxnum = max(nums)
        node = TreeNode(maxnum)

        index = nums.index(maxnum)
        left = nums[:index]
        right = nums[index+1:]

        node.left = self.constructMaximumBinaryTree(left)
        node.right = self.constructMaximumBinaryTree(right)
        return node

617.合并二叉树

代码随想录文档讲解
LeetCode

注意: 可以采用重复使用题目给出的节点,而不是创建新节点,节省时间空间

伪代码c++


需要额外写一个辅助函数(用于计算高度的函数)

python代码

# 我的代码,不够简洁
class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1 and not root2:
            return None
        elif not root1:
            node = root2
        elif not root2:
            node = root1
        else:
            node = TreeNode(root1.val + root2.val)
            node.left = self.mergeTrees(root1.left, root2.left)
            node.right = self.mergeTrees(root1.right, root2.right)
        return node
# 递归-前序-修改root1
class Solution:
    def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:
        # 递归终止条件: 
        #  但凡有一个节点为空, 就立刻返回另外一个. 如果另外一个也为None就直接返回None. 
        if not root1: 
            return root2
        if not root2: 
            return root1
        # 上面的递归终止条件保证了代码执行到这里root1, root2都非空. 
        root1.val += root2.val # 中
        root1.left = self.mergeTrees(root1.left, root2.left) #左
        root1.right = self.mergeTrees(root1.right, root2.right) # 右
        
        return root1 # ⚠️ 注意: 本题我们重复使用了题目给出的节点而不是创建新节点. 节省时间, 空间. 

# 还有更优化的代码

700.二叉搜索树中的搜索

代码随想录文档讲解
LeetCode

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

根据二叉搜索树的性质,可以进行代码简化

伪代码c++



需要额外写一个辅助函数(用于计算高度的函数)

python代码

class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root:
            return None
        if root.val == val:
            return root
        nodeleft = self.searchBST(root.left, val)
        noderight = self.searchBST(root.right, val)
        return nodeleft if nodeleft else noderight
# 根据二叉搜索树的性质 进行代码简化
class Solution:
    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.验证二叉搜索树

看其他解题方法

代码随想录文档讲解
LeetCode

思路

这道题目比较容易陷入两个陷阱:

  1. 陷阱1
    不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。
    在这里插入图片描述
    二叉搜索树的定义:
    节点的左子树只包含 小于 当前节点的数。(==注意:==左子树,不是左孩子)
    节点的右子树只包含 大于 当前节点的数。
    所有左子树和右子树自身必须也是二叉搜索树。

  2. 陷阱2
    样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。
    此时可以初始化比较元素为longlong的最小值。

解题:

  1. 中序遍历,一直更新maxVal,一旦发现maxVal >= root->val,就返回false,注意元素相同时候也要返回false。
  2. 设定极小值,进行比较

伪代码c++


python代码

class Solution:
    def __init__(self):
        self.vec = []

    def traversal(self, root):
        if root is None:
            return
        self.traversal(root.left)
        self.vec.append(root.val)  # 将二叉搜索树转换为有序数组
        self.traversal(root.right)

    def isValidBST(self, root):
        self.vec = []  # 清空数组
        self.traversal(root)
        for i in range(1, len(self.vec)):
            # 注意要小于等于,搜索树里不能有相同元素
            if self.vec[i] <= self.vec[i - 1]:
                return False
        return True

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RCE的另外一些绕过练习

目录 被过滤了flag怎么办 方法 结果 过滤了flag、php、system 方法一 结果 ​编辑 方法二 过滤了很多但是主要的就是过滤了空格 和 注意一下这个就行 方法一 方法二 相对于上面一道题来说多过滤了一个括号 方法一 被过滤了flag怎么办 <?php error_reportin…

29岁才转行软件测试,目前31了,我的一些经历跟感受

按惯例&#xff0c;先说下我基本情况。我是90年的&#xff0c;算是最早的90后&#xff0c;现在跟你介绍的时候还恬不知耻的说我是90后&#xff0c;哈哈&#xff0c;计算机专业普通本科毕业。在一个二线城市&#xff0c;毕业后因为自身能力问题、认知水平问题&#xff0c;再加上…

Cesium倾斜相机视角观察物体

先看效果&#xff1a; 在cesium中&#xff0c;我们有时需要倾斜相机视角去观察物体&#xff0c;如相机俯视45观察物体。 cesium的api提供了倾斜相机视角的配置&#xff0c;但是直接使用cesium的api不能达到我们想要的效果。 函数如下&#xff1a; function flyToBox() {let l…

XSS反射性

目录 1.URL 编码 "javascript:alert(1)" 2.HTML字符实体编码 &#;"javascript" 和 URL 编码 "alert(2)" 3.URL 编码 ":" 就是%3a 4.HTML字符实体编码 < 和 > 5.HTML字符实体编码 < 和 > 6.<s…

UGUI合批个人学习心得

从目前学到的知识上看&#xff0c;合批就是最基础的条件就是需要贴图和材质相同&#xff0c;这两个一样才有可能合批&#xff0c;UGUI合批是以Canvas为单位的。 UGUI的合批就是把某个Canvas下满足合批规则的UI控件的网格合并为一个大的网格&#xff0c;然后将这些网格合并在一起…

MyBatis首篇-入门第一文

目录 MyBatis关键特性和概念使用步骤简单示例 核心组件主要特点常见使用情景常见优化策略 MyBatis MyBatis是一个优秀的半自动化持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis避免了大部分JDBC代码和手动设置参数以及获取结果集的繁琐性。用户只需要…

机器学习/深度学习——模型的欠拟合和过拟合,正则化方法详解

机器学习/深度学习——模型的欠拟合和过拟合&#xff0c;正则化方法 详解 搭配以下文章进行学习&#xff1a; 卷积神经网络&#xff1a; 深度学习——卷积神经网络&#xff08;convolutional neural network&#xff09;CNN详解&#xff08;一&#xff09;——概述. 步骤清晰…

WHD温湿度控制器:智能守护,让电力设备远离“温湿”困扰,安全运行每一刻

​在电力系统的庞大网络中&#xff0c;中高压开关柜、端子箱、环网柜及箱变等关键设备&#xff0c;其稳定运行直接关系到电力供应的安全与效率。WHD系列温湿度控制器以智能化、精准化的温湿管理方案&#xff0c;为电力设备筑起了一道坚不可摧的安全防线。 WHD系列温湿度控制器搭…

【Spring Boot】全局异常处理

目录 背景 前言 设计步骤 1.定义异常信息类&#xff1a; 2.自定义异常&#xff1a; 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中&#xff0c;如何处理全局异常的&#xff0c;也就是如何捕获全局异…

软件包管理器以及NFS

一.YUM 1.1 YUM介绍 学习YUM 软件仓库&#xff0c;可以完成安装、卸载、自动升级 rpm 软件包等任务&#xff0c;能够自动 查找并解决 rpm 包之间的依赖关系&#xff0c;而无须管理员逐个、手工地去安装每个 rpm 包&#xff0c;使管 理员在维护大量 Linux 服务 器时更加轻松自…

MS Visual Studio使用ACLLib库

目录 前言 二、MS Visual Studio使用ACLLib库 1.拿到库文件 2.新建VS项目 1&#xff09;打开VS Studio 2&#xff09;新建Windos 桌面向导文件 3&#xff09;创建 4&#xff09;选择空项目 5&#xff09; 新建main.c文件 3.将得到的acllib.c 与 acllib.h文件复制到项目…

HNU-2024计算机系统-小班讨论6

写在前面&#xff1a; 本次讨论课的选题主要围绕着程序性能优化章节中的分支预测部分&#xff0c;我个人感觉这板块是CSAPP教材中最不好理解的部分&#xff0c;需要大家多看教材&#xff0c;多讨论分析。 本文所有题目由全组同学共同完成&#xff0c;感谢每一位同学的支持与付…

【C++】序列与关联容器(二)序列容器

【C】序列与关联容器&#xff08;二&#xff09;序列容器 一、C 标准库中的序列容器模板二、array 容器模板三、vector元素模板 一、C 标准库中的序列容器模板 每种容器的实现方法的难易不同&#xff0c;特性不同&#xff0c;适用的应用场景不同 array &#xff1a;元素个数固…

11.4.软件系统分析与设计-算法的分析与设计

算法的分析与设计 涉及到的考点&#xff1a; C语言数据结构(树、链表)–考的不多时间复杂度和空间复杂度的计算排序算法四大经典算法 程序设计语言的基本成分 数据成分&#xff1a;指一种程序设计语言的数据和数据类型。数据分为常量&#xff08;程序运行时不可改变&#x…

让IP实现https访问的方法

IP SSL证书是主要保护公网ip地址的一种专属信任SSL证书&#xff0c;相比而言IP SSL证书体现的定位很明确。 IP SSL证书是一种数字证书&#xff0c;用于保护网络服务器和网络浏览器之间的通信。它是由受信任的证书颁发机构(CA)颁发的安全套接字层(SSL)证书。证书用于验证服务器…

day 26网络编程—协议

1、协议&#xff1a;通信双方约定的一套标准 2、国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 数据传输的…

丑数的计算

丑数 就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n &#xff0c;请你判断 n 是否为 丑数 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;n 6 输出&#xff1a;true 解释&#xff1a;6 2 3 示…

Linux---DHCP和FTP(原理+实操)

文章目录 DHCP和FTP&#xff08;原理实操&#xff09;DHCP使用DHCP&#xff08;自动分配IP&#xff09;的好处分配方式租约过程第一次重新登录更新租约DHCP服务可分配的地址信息主要包括 DHCP安装和配置实验目的实验环境:网络环境:系统环境:具体操作实操注意一、将三台虚拟机网…

数据结构——排序(4):归并排序+计数排序

目录 一、归并排序 &#xff08;1&#xff09;思想 &#xff08;2&#xff09;过程图示 &#xff08;3&#xff09;代码实现 (4) 代码解释 &#xff08;5&#xff09;复杂度 二、非比较排序&#xff08;计数排序&#xff09; &#xff08;1&#xff09;操作步骤 &#x…

《新一代数据可视化分析工具应用指南》正式开放下载

2024年8月12日&#xff0c;由DataEase开源项目组编写的《新一代数据可视化分析工具应用指南》白皮书正式面向广大用户开放下载。 《新一代数据可视化分析工具应用指南》是DataEase开源项目组为了支持企业落地并推广BI工具、推进企业数据可视化建设而编著的指导手册。通过本白皮…