代码随想录算法训练营day19 | 二叉树阶段性总结

本文详细介绍了二叉树的基础概念,包括理论、遍历方法(深度优先和广度优先)、求解二叉树的属性(如对称性、深度、节点数量等)、二叉树的修改与构造,以及二叉搜索树的特性和操作。总结指出构造时通常采用前序遍历,属性求解则依赖于遍历顺序的不同。
摘要由CSDN通过智能技术生成

各个部分题目的代码题解都在我往日的二叉树的博客中。
(day14到day22)

二叉树理论基础

二叉树的理论基础参考我的朱提第一篇二叉树的文章:
链接: day14
得注意各种二叉树的种类、存储方式、遍历方式、定义方式。

二叉树的遍历方式

深度优先遍历

链接: day14
二叉树前中后序的递归三部曲
二叉树前中后序的迭代法
二叉树前中后序的迭代法的统一形式

广度优先遍历

链接: day15
二叉树的层序遍历

求二叉树的属性

  • 二叉树:是否对称
    递归:后序,比较的是根节点的左子树与右子树是不是相互翻转
    迭代:使用队列/栈将两个节点顺序放入容器中进行比较
  • 二叉树:求最大深度
    递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度
    迭代:层序遍历
  • 二叉树:求最小深度
    递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义
    迭代:层序遍历
  • 二叉树:求有多少个节点
    递归:后序,通过递归函数的返回值计算节点数量
    迭代:层序遍历
  • 二叉树:是否平衡
    递归:后序,注意后序求高度和前序求深度,递归过程判断高度差
    迭代:效率很低,不推荐
  • 二叉树:找所有路径
    递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径
    迭代:一个栈模拟递归,一个栈来存放对应的遍历路径
  • 二叉树:递归中如何隐藏着回溯
    详解二叉树:找所有路径 中递归如何隐藏着回溯
  • 二叉树:求左叶子之和
    递归:后序,必须三层约束条件,才能判断是否是左叶子。
    迭代:直接模拟后序遍历
  • 二叉树:求左下角的值
    递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点。
    迭代:层序遍历找最后一行最左边
  • 二叉树:求路径总和
    递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树。
    迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和

二叉树的修改与制造

  • 翻转二叉树
    递归:前序,交换左右孩子
    迭代:直接模拟前序遍历
  • 构造二叉树
    递归:前序,重点在于找分割点,分左右区间构造
    迭代:比较复杂,意义不大
  • 构造最大的二叉树
    递归:前序,分割点为数组最大值,分左右区间构造
    迭代:比较复杂,意义不大
  • 合并两个二叉树
    递归:前序,同时操作两个树的节点,注意合并的规则
    迭代:使用队列,类似层序遍历

求二叉搜索树的属性

  • 二叉搜索树中的搜索
    递归:二叉搜索树的递归是有方向的
    迭代:因为有方向,所以迭代法很简单
  • 是不是二叉搜索树
    递归:中序,相当于变成了判断一个序列是不是递增的
    迭代:模拟中序,逻辑相同
  • 求二叉搜索树的最小绝对差
    递归:中序,双指针操作
    迭代:模拟中序,逻辑相同
  • 求二叉搜索树的众数
    递归:中序,清空结果集的技巧,遍历一遍便可求众数集合
  • 二叉搜索树转成累加树
    递归:中序,双指针操作累加
    迭代:模拟中序,逻辑相同

二叉树公共最先问题

  • 二叉树的公共祖先问题
    递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。
    迭代:不适合模拟回溯
  • 二叉搜索树的公共祖先问题
    递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先
    迭代:按序遍历

二叉搜索树的修改与构造

  • 二叉搜索树中的插入操作
    递归:顺序无所谓,通过递归函数返回值添加节点
    迭代:按序遍历,需要记录插入父节点,这样才能做插入操作
  • 二叉搜索树中的删除操作
    递归:前序,想清楚删除非叶子节点的情况
    迭代:有序遍历,较复杂
    修剪二叉搜索树
    递归:前序,通过递归函数返回值删除节点
    迭代:有序遍历,较复杂
  • 构造二叉搜索树
    递归:前序,数组中间节点分割
    迭代:较复杂,通过三个队列来模拟

总结

涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

求二叉搜索树的属性,一定是中序。

注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,【二叉树:找所有路径】也用了前序,这是为了方便让父节点指向子节点。

所以求普通二叉树的属性还是要具体问题具体分析。

参考文档:

链接: 二叉树总结

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值