Leetcode | 以二叉树,多叉树为主题的理论,真题以及图解【更新中】

news2024/11/23 13:46:28

1.理论

1.1.二叉树

1.1.1.二叉树的遍历

前序(preorder traversal):从根节点开始,先访问当前节点,然后递归地遍历左子树,最后递归地遍历右子树。即“根-左-右”的顺序。

中序遍历(inorder traversal):从根节点开始,先递归地遍历左子树,然后访问当前节点,最后递归地遍历右子树。即“左-根-右”的顺序。

后序遍历(postorder traversal):从根节点开始,先递归地遍历左子树,然后递归地遍历右子树,最后访问当前节点。即“左-右-根”的顺序。

层序遍历(level-order traversal):从根节点开始,按照树的层次顺序,从上到下、从左到右依次访问节点。

遍历顺序: 12345

1.1.2.树的路径和(path sum in binary trees)

树的路径和指的是从树的根节点到叶子节点的路径上所有节点值的和。通常问题会要求找出是否存在这样的路径,或者找出所有满足条件的路径。解决这类问题通常需要使用深度优先搜索(DFS)或广度优先搜索(BFS)等方法。

1.1.3.二叉查找树(binary search trees(BST)

 二叉查找树是一种二叉树,其中每个节点的值大于其左子树中的所有节点的值,小于其右子树中的所有节点的值。这种特性使得在BST中进行搜索、插入和删除等操作具有较高的效率。通常,中序遍历BST会得到一个有序的序列。

特性:

  • 左子树中的所有节点的键值小于根节点的键值
  • 右子树中的所有节点的键值大于根节点的键值
  • 左子树和右子树也都是二叉搜索树

1.1.4.二叉树转换

二叉树转换指的是将一个二叉树转换为另一个形式的操作。例如,可以将一个有序数组转换为平衡的二叉搜索树,或者将一个二叉搜索树转换为双向链表等。这类问题常常需要根据特定的转换规则来进行设计和实现。

1.2.多叉树遍历

多叉树是一种每个节点可以有多个子节点的树结构。多叉树的遍历方式与二叉树类似,也包括前序、中序、后序和层序遍历。在多叉树中,每个节点的子节点数目不固定,因此在遍历时需要考虑如何处理不同数量的子节点。

真题

简单

94.二叉树的中序遍历

题目:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

方法:递归方解法

class TreeNode:
     def __init__(self, val=0, left=None, right=None):
         self.val = val
         self.left = left        
         self.right = right

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        result=[]
        if root is None:
            return result
        result +=self.inorderTraversal(root.left)
        result.append(root.val)
        result +=self.inorderTraversal(root.right)
        return result

101.对称二叉树

题目:给你一个二叉树的根节点 root , 检查它是否轴对称。

题目分析:首先需要检查根节点是否为空,如果为空,返回True,就被认为是对称的。再确定俩边是否为镜像对称,俩个节点都为空被认为是对称的,在比较左右的节点值,如果相同,则返回True,否则False。

方法:迭代法

# 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 isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        return self.ismrrior(root.left,root.right)

    def ismrrior(self,left:TreeNode,right:TreeNode) -> bool:
        if not left and not right:
            return True
        if not left or not right or left.val != right.val:
            return False
        return self.ismrrior(left.left,right.right) or self.ismrrior(left.right,right.left)
        

104.二叉树的最大深度

108.将有序数组转换为二叉搜索树

226.翻转二叉树

543.二叉树的直径

590.N叉树的后序遍历

给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔

中等

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 isValidBST(self, root:TreeNode,min_val=float('-inf'),max_val=float('inf')) -> bool:
        if root is None:
            return True
        if root.val<=min_val or root.val>=max_val:
            return False
        return (self.isValidBST(root.left,min_val,root.val) and self.isValidBST(root.right,root.val,max_val))
        

102.二叉树的层序遍历

困难

124.二叉树中的最大路径和(Binary Tree Maximum Path Sum)

题目:给定一个二叉树,返回最大路径之和

Given the root of a binary tree, return the maximum path sum of any non-empty path.

 题目分析:求出左子树、右子树的最大值,将最大值相加。

# 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 maxPathSum(self, root: Optional[TreeNode]) -> int:
        self.max_sum=float('-inf')
        def max_path_sum(node):
            if node is None:
                return 0
            left_sum=max(0,max_path_sum(node.left))
            right_sum=max(0,max_path_sum(node.right))
            self.max_sum=max(self.max_sum,left_sum+right_sum+node.val)
            return max(left_sum,right_sum)+node.val

        max_path_sum(root)
        return self.max_sum

 代码解释:

  • 创建MaxPathSum 的方法,接收一个二叉树的根节点作为输入,初始化一个变量max_sum为负无穷,用来存储最大路径和的值
  • 再定义一个max_path_sum的辅助函数,用来处理特殊情况,假如节点为空时,返回0.再分别计算左子树和右子树的最大路径和,分别将他们存储在left/right_sum中。
  • 更新max_sum的值,取当前最大路径和左右子树路径和的和,在加上节点值的最大值
  • 最后返回当前节点为根的最大路径和,是左右子树路径和中较大的值再加上当前节点的值。
  • 调用max_path_sum函数,从根节点递归计算最大路径和
  • 最终但会max_sum,整棵树的最大路径和

--》单独计算左子树和右子树是为了确定这些路径是连续的

--》node.val 在递归过程中会被更新为当前节点的值,以确保在计算每个子树的最大路径和时都考虑了当前节点的值。

参考文献

【1】LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

【2】Inorder Traversal of Binary Tree - GeeksforGeeks 

【3】Inorder Tree Traversal – Iterative and Recursive | Techie Delight 

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

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

相关文章

mysql面试题九(SQL优化)

目录 1.一条 SQL 是如何执行的 2.索引失效的几种情况 3.EXPLAIN 4.Where 子句如何优化 5.超大分页或深度分页如何处理 6.大表查询如何优化 7.分库分表 基本概念 分库分表方法 水平拆分 垂直拆分 分库分表后的注意事项 1.一条 SQL 是如何执行的 在MySQL中&#xff0…

C++|STL简介-string-vector基础运用

目录 什么是STL STL里面有什么 容器 string 序列式容器 vector deque list 关联式容器 set multiset map multimap 算法 非可变序列算法 可变序列算法 排序算法 数值算法 什么是STL STL(标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一…

不完全微分PD控制器(CODESYS源代码+算法详细介绍)

完全微分计算公式为Kp*Td/Ts(e(k)-e(k-1))。有关位置式PID和增量式PID更多相关内容,大家可以参考下面的文章链接: 1、CODESYS位置式PID CODESYS位置式PID(完整ST源代码)_codesys pid功能块-CSDN博客文章浏览阅读1.1k次,点赞2次,收藏2次。CODESYS增量式PID完整源代码请参看…

红极一时的VB,输给时代,新型开发工具,或成未来

若要称VB为非专业人员改造自身行业的得力工具&#xff0c;这绝不夸张。 对于众多编程语言而言&#xff0c;单纯学习语言本身往往应用有限&#xff0c;比如C和Qt虽有关联却各自独立&#xff0c;但VB却独树一帜&#xff0c;它的实用性远超常规编程语言。 在软件开发的历史长河中…

【go零基础】go-zero从零基础学习到实战教程 - 1项目表设计

既然是0基础&#xff0c;现在来写下设计思路&#xff0c;因为go-zero是个微服务架构&#xff0c;所以&#xff0c;哪怕是0基础&#xff0c;也从两个服务模块开始写起。 我们的目标是&#xff1a;最小可用微服务架构最佳实践&#xff01; 好了&#xff0c;饼画完了。 第0部分写到…

next初体验

创建项目 npm init next-app app-test 每次都会使用最新的creat-next-app去创建最新版本的项目 这里新版本的路径有所区别&#xff1a;他多了一个app的文件夹。 兼容老项目我们可以在app文件夹的同级增加pages目录&#xff0c;然后创建页面。新项目可以直接在app下创建&…

网络层 --- IP协议

目录 1. 前置性认识 2. IP协议 3. IP协议头格式 3.1. 4位版本 3.2. 4位首部长度 3.3. 8位服务类型 3.4. 16位总长度 3.5. 8位生存时间 TTL 3.6. 8位协议 3.7. 16位首部检验和 3.8. 32位源IP和32位目的IP 4. 分片问题 4.1. 为什么要分片 4.2. 分片是什么 4.2.1. …

进迭时空宣布开源RISC-V芯片的AI核心技术

仟江水商业电讯&#xff08;4月29日 北京 委托发布&#xff09;4月29日&#xff0c;在“创芯生生不息——进迭时空2024年度产品发布会”上&#xff0c;进迭时空CEO、创始人&#xff0c;陈志坚博士宣布将开源进迭时空在自研RISC-V AI CPU上的核心技术&#xff0c;包括AI扩展指令…

根据txt文件绘制词云 -- python

根据一段文字绘制词云&#xff0c;我们有两种方法 &#xff0c;一种是登录专业的绘图网站http://yciyun.com/ 不过&#xff0c;貌似这个网站需要会员才可以体验&#xff0c;他只是给出了一些形状图案的词云&#xff0c;虽然看起来很精美&#xff0c;但是他不能让我们自己随意更…

看 周鸿祎、雷,那俩红、绿少年

导语&#xff1a;百战归来&#xff0c;他们成为了中国经济的新“发动机” 文 | 魏强 雷军、周鸿祎变成网红这事&#xff0c;已不仅是传播现象&#xff0c;也不是这两个老板为了卖车的卖力表演和吆喝&#xff0c;它俨然成了中国经济新一轮的“发动机”。 过去几年&#xff0c;因…

包 与 访问修饰符

1. 包 1.1 包的三大作用 1. 区分相同名字的类 2. 当类很多时,可以很好的管理类[看Java API文档] 3. 控制访问范围 1.2 包基本语法 package com.zakeau; 说明: 1. package关键字,表示打包. 2. com.zakedu : 表示包名 1.3 包的本质分析(原理) 包的本质实际上就是创建不同的…

Nuxt3 实战 (六):Footer 底部布局

前言 今天开发项目的 Footer 布局&#xff0c;这里我们参考 Nuxt-UI 官网的布局。 需求拆分 准备好域名备案号和 icp 图标底部社交按钮链接或其他链接布局组件开发 Footer 布局 新建 components/AppFooter.vue 文件&#xff1a; <template><footer class"f…

什么是编译与链接呢!

引言&#xff1a; 在ANSIC中存在两种编译环境 第一种是翻译环境&#xff1a;可以将环境中的源代码转换成能被机器执行的二进制指令&#xff1b;翻译环境即为我们所使用的编译器&#xff0c;可以将test.c文件翻译为test.exe文件 第二种是运行环境&#xff1a;它用于实际代码的…

LabVIEW 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到LabVIEW.2024”。 返回解压后的文件夹&#xff0c;鼠标右击“ni_labview-2024”选择“装载”。 鼠标右击“Install”选择“以管理员身份运行”。 点击“我接受上述2条许可协议”&#xff0c;然后点击“下一步”。 点击“下一步”。 …

Docker容器中安装vim

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Docker 是一个开源…

uni-app中配置自定义条件编译

前提&#xff1a;官网提供的自定义编译不满足条件 package.json | uni-app官网 下文&#xff1a;不详细写&#xff0c;主要写关键思路 package.json文件 主要看scripts的执行命令&#xff0c;其他依赖就是用vue-cli方式创建uni-app项目生成的 {"name": "un…

计算机组成实验(5)

一、实验目的和要求 1.1 实验目的 1. 复习二进制加减、乘除的基本法则 2. 掌握补码的基本原理和作用 3. 了解浮点数的表示方法及加法运算法则 4. 进一步了解计算机系统的复杂运算操作 1.2 实验要求 1. 熟悉二进制原码补码的概念,了解二进制加减乘除的原理与操作实现。 …

部署YUM仓库和NFS共享存储服务

目录 1. YUM仓库服务 1.1 YUM概述 1.2 准备安装源 1.3 yum在线源替换方法 2.制作YUM源 2.1制作ftp源 3.yum软件包的下载方式 4.NFS共享存储服务 4.1 NFS 4.2 NFS网络文件系统 4.3 NFS配置 1. YUM仓库服务 1.1 YUM概述 yum是一个基于RPM包&#xff08;是Red-Ha…

AI与新能源催生新增长,电子制造业如何提升预测力与连接力?

国产替代和新基建带来的结构性机遇&#xff0c;AI和新能源汽车行业的增长所带来的需求提升&#xff0c;都给电子制造行业以乐观的理由。但是&#xff0c;不少企业的客户经营管理、供需平衡与供应链协同等所面临的挑战仍在&#xff0c;如何为行业高质量增长持续注入动能&#xf…

Mycat(三)读写分离双主双从

文章目录 搭建双主双从双主机配置双从机配置双从配置两个主机互相复制停止从服务复制功能重新配置主从 修改 Mycat 的集群配置实现多种主从双主双从集群角色划分增加两个数据源修改集群配置文件读写分离配置扩展&#xff08;1&#xff09;读写分离(一主一从,无备)(m是主,s是从)…