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

2024-04-30 06:28

本文主要是介绍Leetcode | 以二叉树,多叉树为主题的理论,真题以及图解【更新中】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 = valself.left = left        self.right = rightclass Solution:def inorderTraversal(self, root: TreeNode) -> List[int]:result=[]if root is None:return resultresult +=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 Truereturn self.ismrrior(root.left,root.right)def ismrrior(self,left:TreeNode,right:TreeNode) -> bool:if not left and not right:return Trueif not left or not right or left.val != right.val:return Falsereturn 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 Trueif root.val<=min_val or root.val>=max_val:return Falsereturn (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 0left_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.valmax_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 

这篇关于Leetcode | 以二叉树,多叉树为主题的理论,真题以及图解【更新中】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948103

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.