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

相关文章

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

哈希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