当前位置: 首页 > news >正文

算法笔记 10

二叉树系列算法核心纲领 | labuladong 的算法笔记https://labuladong.online/algo/essential-technique/binary-tree-summary/这篇笔记容量很大,干货满满,需要反复复盘,值得反复学习的重磅好文。

1 对二叉树前中后序遍历的深入解读

  1. 前序位置的代码在刚刚进入一个二叉树节点的时候执行;

    后序位置的代码在将要离开一个二叉树节点的时候执行;

    中序位置的代码在一个二叉树节点左子树都遍历完,即将开始遍历右子树的时候执行。

  2. 前中后序的本质前中后序并非仅仅是三个元素顺序不同的列表,而是遍历二叉树时处理节点的三个特殊 “时间点”:
    • 前序位置:刚进入节点时执行代码。
    • 中序位置:遍历完左子树、即将遍历右子树时执行代码。
    • 后序位置:将要离开节点时执行代码。
  3. 后序遍历的特殊性后序位置的代码执行时机是在节点的左右子树都遍历完成之后,这使得它天然适合处理子树相关的后续逻辑,比如计算子树的高度、统计子树的节点数、释放子树内存等(只有当子树的逻辑都处理完,才能对当前节点进行最终操作)。
  4. 多叉树无中序遍历的原因二叉树的中序遍历依赖于 “左子树 - 根节点 - 右子树” 的二叉结构,多叉树的节点有多个子节点,不存在 “左子树遍历完、即将遍历右子树” 这样明确且统一的中间时机,因此没有中序遍历的概念。

2 二叉树递归解法的两类思路及函数命名习惯

  1. 解法分类与对应算法框架
    • 遍历思路:遍历一遍二叉树得出答案,对应回溯算法核心框架,函数签名一般为void traverse(...),无返回值,靠更新外部变量计算结果。
    • 分解问题思路:通过分解问题计算答案,对应动态规划核心框架,函数名依具体功能而定,一般有返回值,返回子问题的计算结果。
  2. 函数命名习惯的意义这种命名风格能突出函数作用和解题思维模式,例如回溯的void backtrack(...)无返回值,动态规划的dp函数有返回值,与二叉树两种递归思路的函数设计逻辑一致,便于理解和运用。

3 二叉树前序遍历的分解式理解

  1. 前序遍历的结构特点前序遍历结果的结构为:根节点 + 左子树的前序遍历结果 + 右子树的前序遍历结果。以图中二叉树为例,根节点是1,左子树的根是2,其前序遍历为2 5 4 6 7;右子树的根是3,其前序遍历为3 8 9,最终前序遍历序列为1 2 5 4 6 7 3 8 9,完全符合该结构。
  2. 分解问题的意义这种结构可以将二叉树的前序遍历问题分解为 “根节点处理 + 左子树遍历 + 右子树遍历” 三个子问题,体现了递归分解问题的思路,也为理解二叉树的构造、遍历类算法提供了基础逻辑。
class Solution {
public:// 定义:输入一棵二叉树的根节点,返回这棵树的前序遍历结果vector<int> preorderTraversal(TreeNode* root) {vector<int> res;if (root == nullptr) {return res;}// 前序遍历的结果,root->val 在第一个res.push_back(root->val);// 利用函数定义,后面接着左子树的前序遍历结果vector<int> left = preorderTraversal(root->left);res.insert(res.end(), left.begin(), left.end());// 利用函数定义,最后接着右子树的前序遍历结果vector<int> right = preorderTraversal(root->right);res.insert(res.end(), right.begin(), right.end());return res;}
};

insert的写法

在 C++ 中,insert 是容器(如 vectorliststring 等)的成员函数,用于在容器的指定位置插入元素或元素范围。

以你代码中的 vector<int> 为例,res.insert(res.end(), left.begin(), left.end()) 的作用是:将 left 容器中从 begin() 到 end() 的所有元素,插入到 res 容器的 end() 位置(即容器末尾),从而实现将左子树的前序遍历结果拼接在根节点之后。

简单来说,insert 在这里的功能是批量插入元素,实现多个容器间的内容拼接,帮助我们构建出 “根节点 + 左子树前序 + 右子树前序” 的完整前序遍历序列。

4 前中后序代码的能力

BST 是二叉搜索树(Binary Search Tree)的简称,也叫二叉排序树,是一种特殊的二叉树,具有以下核心特性:

  • 节点值约束:若左子树非空,左子树上所有节点的值均小于根节点的值;若右子树非空,右子树上所有节点的值均大于根节点的值;左右子树也分别是二叉搜索树。
  • 中序遍历有序性:对 BST 进行中序遍历,会得到一个递增的有序序列,这一特性使其在需要有序数据的场景中非常实用,比如可将其视为 “遍历有序数组”。
  • 高效操作:基于其结构特性,BST 的查找、插入、删除操作在理想情况下时间复杂度为 O (log n),适合动态数据的管理场景,是很多高级数据结构(如 AVL 树、红黑树)的基础。

5 后序位置解题思路分析

  • 思路类型:运用后序位置的题目一般采用分解问题的思路。
  • 核心原因:当前节点会接收并利用左右子树返回的信息,这意味着原问题被分解为 “当前节点 + 左右子树子问题” 的形式,符合分解问题的递归逻辑。
  • 优化提示:若写出递归套递归的解法,可反思是否能通过后序遍历优化,利用其同时获取左右子树信息的能力提升效率。
http://www.dtcms.com/a/574522.html

相关文章:

  • 锛网站开封seo公司
  • Linux 进程资源占用分析指南
  • 电子商务网站建设评估的指标wordpress程序图片打开慢
  • 网站开发时如何设计英文版本山东手机网站建设
  • 算法题种类与解题思路全面指南:基于LeetCode Hot 100与牛客Top 101
  • Web开发身份认证技术解析
  • 做汽车网站怎么挣钱吗深圳网站建设公司好
  • 网站建设素材网页apache 创建网站
  • 虚函数指针与虚函数表:C++多态的实现奥秘
  • 小说类网站怎么做建设推广营销型网站应该注意什么
  • ubuntu 安装 SRS (Simple RTMP Server) 是一个开源的流媒体服务器
  • 怎么自己设计网站外贸公司 网站
  • 【仓颉纪元】仓颉鸿蒙应用深度开发:待办事项 App 全流程实战
  • 领英被封?账号受限该怎么处理?
  • 信誉好的镇江网站建设网站备案名称中国开头
  • 【C语言】localtime和localtime_r;strftime和strftime_l
  • 扁平化设计网站代码打开网站后直接做跳转
  • Go 语言依赖注入实战指南:从基础到高级实践
  • 全场景自动化 Replay 技术:金仓 KReplay 如何攻克数据库迁移 “难验证“ 难题
  • 阳新县建设局网站win2008系统asp网站建设
  • 网站域名分几种新东方雅思培训机构官网
  • 网站怎么样做不违规学科基地网站建设
  • MySQL-4-视图和索引
  • 电脑被捆绑软件缠上?3 步根治卡顿弹窗~
  • Linux时间处理与系统时间管理详解
  • 上饶建设局网站开封到濮阳
  • 织梦网站动态华为云自助建站
  • RocketMQ集群核心概念 生产者端的负载均衡
  • 做恒生指数看什么网站贵州网站优化
  • 百度搜索引擎平台seo全称英文怎么说