二叉树:总结篇(需要掌握的二叉树技能都在这里了)

2023-11-08

二叉树:总结篇!(需要掌握的二叉树技能都在这里了)

二叉树的理论基础

关注二叉树的种类、存储方式、遍历方式、定义方式

二叉树的遍历方式

1. 深度优先遍历

  1. 递归三部曲初次亮相
  2. 通过栈模拟递归

2. 广度优先遍历

通过队列模拟

求二叉树的属性

1. 是否对称

递归:后序,比较的是根节点的左子树与右子树是不是相互翻转
迭代:使用队列/栈将两个节点顺序放入容器中进行比较

2. 求最大深度

递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度
迭代:层序遍历

3. 求最小深度

递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义
迭代:层序遍历

4. 求有多少个节点

递归:后序,通过递归函数的返回值计算节点数量
迭代:层序遍历

5. 是否平衡

递归:后序,注意后序求高度和前序求深度,递归过程判断高度差
迭代:效率很低,不推荐

6. 找所有路径

递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径
迭代:一个栈模拟递归,一个栈来存放对应的遍历路径

7. 递归中如何隐藏着回溯

找所有路径中递归如何隐藏着回溯

8. 求左叶子之和

递归:后序,必须三层约束条件,才能判断是否是左叶子
迭代:直接模拟后序遍历

9. 求左下角的值

递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点
迭代:层序遍历找最后一行最左边

10. 求路径总和

递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树
迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和

二叉树的修改与构造

1. 翻转二叉树

递归:前序,交换左右孩子
迭代:直接模拟前序遍历

2. 构造二叉树

递归:前序,重点在于找分割点,分左右区间构造
迭代:比较复杂,意义不大

3. 构造最大的二叉树

递归:前序,分割点为数组最大值,分左右区间构造
迭代:比较复杂,意义不大

4. 合并两个二叉树

递归:前序,同时操作两个树的节点,注意合并的规则
迭代:使用队列,类似层序遍历

求二叉搜索树的属性

1. 二叉搜索树中的搜索

递归:二叉搜索树的递归是有方向的
迭代:因为有方向,所以迭代法很简单

2. 是不是二叉搜索树

递归:中序,相当于变成了判断一个序列是不是递增的
迭代:模拟中序,逻辑相同

3. 求二叉搜索树的最小绝对差

递归:中序,双指针操作
迭代:模拟中序,逻辑相同

4. 求二叉搜索树的众数

递归:中序,清空结果集的技巧,遍历一遍便可求众数集合

5. 二叉搜索树转成累加树

递归:中序,双指针操作累加
迭代:模拟中序,逻辑相同

二叉树公共祖先问题

1. 二叉树的公共祖先问题

递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。
迭代:不适合模拟回溯

2. 二叉搜索树的公共祖先问题

递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先
迭代:按序遍历

二叉搜索树的修改与构造

1. 二叉搜索树中的插入操作

递归:顺序无所谓,通过递归函数返回值添加节点
迭代:按序遍历,需要记录插入父节点,这样才能做插入操作

2. 二叉搜索树中的删除操作

递归:前序,想清楚删除非叶子节点的情况
迭代:有序遍历,较复杂

3. 修剪二叉搜索树

递归:前序,通过递归函数返回值删除节点
迭代:有序遍历,较复杂

4. 构造二叉搜索树

递归:前序,数组中间节点分割
迭代:较复杂,通过三个队列来模拟

总结

  1. 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
  2. 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
  3. 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

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

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

二叉树专题汇聚为一张图:
在这里插入图片描述
参考资料代码随想录-二叉树:总结篇!(需要掌握的二叉树技能都在这里了)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树:总结篇(需要掌握的二叉树技能都在这里了) 的相关文章

随机推荐

  • Unity实现用WASD控制一个物体前后左右移动-小白课程01

    1 根据业务逻辑搭建场景 02 根据业务写代码 using System Collections using System Collections Generic using UnityEngine 实现让被挂在的物体往前移动 按下W键往前
  • git submodule的使用

    开发过程中 经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用 而公共代码库的版本管理是个麻烦的事情 今天无意中发现了git的git submodule命令 之前的问题迎刃而解了 添加 为当前工程添加submodule
  • FasterRCNN详解

    FasterRCNN详解 1 2 2 FasterRCNN 1 模型 1 1 主干网络VGG16 or ResNet50 1 2 RPN生成建议框 1 3 RCNN进行分类和回归 2 预测 2 1 预测流程 3 训练 3 1 训练流程 3
  • 多目标跟踪:SORT和Deep SORT

    https zhuanlan zhihu com p 59148865 多目标跟踪 即Multiple Object Tracking MOT 主要任务中是给定一个图像序列 找到图像序列中运动的物体 并将不同帧的运动物体进行识别 也就是给定
  • let和const与var的区别

    目录 一 定义 二 let 三 const 四 代码演示 四 循环中let和var声明的循环变量的区别 4 1 事件的绑定 4 2 循环变量存储的数据数值 4 2 1 var声明的循环变量 4 2 2 let声明的循环变量 一 定义 let
  • 快速排序C++(极简)

    原理建议去B站看视频 注意 注意 注意 刚开始移动的顺序真的很重要 可以试试顺序换一下 整个代码就出问题了 我试过的 第11和12行 代码如下 从小到大 为例 include
  • 操作系统-内存管理

    内存的基础知识 内存可存放数据 程序执行前需要先放到内存中才能被CPU处理 缓和CPU与硬盘之间的速度矛盾 如何区分各个程序的数据是放在什么地方 给内存的存储单元编地址 内存地址从0开始 每个地址对应一个存储单元 装入的三种方式 绝对装入
  • 海康威视测试实习生面试经历

    时间 2018 4 25 地点 海康威视二期 面试岗位 测试实习生 面试结果 通过 背景 大三 通信工程 自学了JAVA 还没学到框架 还是前一天看了一点测试的基础知识就去面试了 面试时间好久 技术面半小时 HR面半小时 技术面 面试官一男
  • 2PC(两阶段提交)方案

    XA方案 2PC的传统方案是在数据库层面实现的 如Oracle MySQL都支持2PC协议 为了统一标准减少行业内不必要的对接成本 需要制定标准化的处理模型及接口标准 国际开放标准组织Open Group定义了分布式事务处理模型DTP Di
  • 微信小程序(初学篇)——仿美团外卖

    初识小程序 为它的小巧玲珑所吸引 不由得心血来潮 这不正是用户所需要的吗 既方便快捷 又不占手机内存 所以我下定决心一定要做出一个自己的小程序 然后赚钱 赚钱 赚钱 当然现在只是学习阶段 所以先仿一个高端产品来挑战自我吧 说到高端 自然然而
  • android定位webview元素,appium— Android定位webView里面的UI元素

    Android SDK中的UIAutomator中本身是不支持网页中的UI元素定位 下面介绍几种常用的定位app内部的网页的UI元素的方法 一 使用chrome浏览器调试移动端网页 这是使用最多的一种方法 首页确保自己的手机已经跟电脑连接且
  • list 的forEach 方法 使用lambda 和“”::”关键字

    你是否会疑惑 list 遍历的时候 就这么一行是怎么做到的如此神奇 List
  • 4、Navicat 安装和使用

    一 Navicat 基本介绍 Navicat 是一款图形化 MySQL 管理软件 Navicat 的功能足以满足专业开发人员的所有需求 但是对数据库服务器初学者来说又简单易操作 Navicat 的用户界面 GUI 设计良好 让你以安全且简单
  • Idea 打开 RunDashboard (完整)

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net sheinenggaosuwo article details 86624759 Ho
  • (详细图解)通过VMware安装centOS系统并进行开机配置(小白版)

    一 VMware的版本及选择 VMware ESX Server ESX本身为一操作系统 不需要宿主操作系统 它本身就是一个操作系统 用来管理硬件资源 所有的系统都安装在它的上面 带有远程web管理和客户端管理功能 VMware GSX S
  • 最近用了一个免费的服务器

    最近看到一个免费的服务器阿贝云 声称是永久免费使用的 有免费虚拟主机 也有免费的云服务器 带宽也不错 下载基本峰值能达到10M s
  • Android学习之完整的注册登录Demo(APP端+服务器端)

    因比赛或者项目需要 写了几个小打小闹的APP 有的处于 单机 状态 有的处于 半联网 状态 觉得学习有点操之过急 所以先缓一缓 梳理一下之前所学的知识 将之前做的一些小玩意儿 整理出来写成博客 第一篇便是大部分APP都具有的注册登录系统 代
  • 15款最好用的思维导图(心智图 )工具

    原文地址 http www linuxidc com Linux 2015 01 111807 htm 思维导图也叫心智图 是一项流行的全脑式学习方法 用来表示词 思路 任务或其他与围绕着一个中央关键词或想法项目的示意图 通过径向 图形和非
  • 【控制】基于PID实现水箱控制系统matlab代码

    1 内容介绍 计算机控制技术 课程是电气信息类专业的主干课程之一 实验教学是该课程教学的重要组成部分 本实验项目以水箱液位为控制参量 设计了包括系统硬件 基于Matlab的控制界面 PID控制程序等内容的 计算机控制技术 实验方案 通过教学
  • 二叉树:总结篇(需要掌握的二叉树技能都在这里了)

    二叉树 总结篇 需要掌握的二叉树技能都在这里了 二叉树的理论基础 二叉树的遍历方式 1 深度优先遍历 2 广度优先遍历 求二叉树的属性 1 是否对称 2 求最大深度 3 求最小深度 4 求有多少个节点 5 是否平衡 6 找所有路径 7 递归