分门别类刷算法,坚持,进步!

刷题路线参考:https://github.com/youngyangyang04/leetcode-master

大家好,我是拿输出博客来督促自己刷题的老三,这一节我们来刷二叉树,二叉树相关题目在面试里非常高频,而且在力扣里数量很多,足足有几百道,不要慌,我们一步步来。我的文章很长,你们 收藏一下。

二叉树基础

二叉树是一种比较常见的数据结构,在开始刷二叉树之前,先简单了解一下一些二叉树的基础知识。更详细的数据结构知识建议学习《数据结构与算法》。

什么是二叉树

二叉树是每个节点至多有两棵子树的树。

二叉树主要的两种形式:满二叉树和完全二叉树。

  • 满⼆叉树:如果⼀棵⼆叉树只有度为0的结点和度为2的结点,并且度为0的结点在同⼀层上,则这棵⼆

    叉树为满⼆叉树。一棵深度为k的满二叉树节点个数为2k -1。

  • 完全⼆叉树:至多只有最下面的两层结点的度数可以小于 2, 并且最下一层上的结点都集中在该层最左边的若干位置上, 则此二叉树称为完全二叉树。

我们可以看出满二叉树是完全二叉树, 但完全二叉树不一定是满二叉树。

⼆叉搜索树

⼆叉搜索树,也可以叫二叉查找树、二叉排序树,是一种有序的二叉树。它遵循着左小右大的规则:

  • 若它的左⼦树不空,则左⼦树上所有结点的值均⼩于它的根结点的值;
  • 若它的右⼦树不空,则右⼦树上所有结点的值均⼤于它的根结点的值;
  • 它的左、右⼦树也分别为⼆叉搜索树

二叉树存储结构

和线性表类似,二叉树的存储结构也可采用顺序存储和链式存储两种方式。

顺序存储是将二叉树所有元素编号,存入到一维数组的对应位置,比较适合存储满二叉树。

由于采用顺序存储结构存储一般二叉树造成大量存储空间的浪费, 因此, 一般二叉树的存储结构更多地采用链式的方式。

二叉树节点

我们在上面已经看了二叉树的链式存储,注意看,一个个节点是由三部分组成的,左孩子、数据、右孩子。

我们来定义一下二叉树的节点节点:

/*** @Author: 三分恶* @Date: 2021/6/8* @Description:**/public class TreeNode {int val;            //值TreeNode left;      //左子树TreeNode right;     //右子树TreeNode() {}TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

二叉树遍历方式

⼆叉树主要有两种遍历⽅式:

  1. 深度优先遍历:先往深⾛,遇到叶⼦节点再往回⾛。

  2. ⼴度优先遍历:⼀层⼀层的去遍历。

那么从深度优先遍历和⼴度优先遍历进⼀步拓展,才有如下遍历⽅式:

  • 深度优先遍历

    • 前序遍历(递归法,迭代法)
    • 中序遍历(递归法,迭代法)
    • 后序遍历(递归法,迭代法)
  • ⼴度优先遍历

    • 层次遍历(迭代法)

我们耳熟能详的就是根、左、右三种遍历,所谓根、左、右指的就是根节点的次序:

  • 前序遍历:根左右
  • 中序遍历:左根右
  • 后序遍历:左右根

还有一种更利于记忆的叫法:先根遍历、中根遍历、后根遍历,这种说法就更一目了然了。

我们来看一个图例:

具体的算法实现主要有两种方式:

  • 递归:树本身就是一种带着递归性质的数据结构,使用递归来实现深度优先遍历还是非常方便的。
  • 迭代:迭代需要借助其它的数据结构,例如栈来实现。

好了,我们已经了解了二叉树的一些基础知识,接下来,面对LeetCode的疯狂打击吧!

深度优先遍历基础

递归基础

二叉树是一种天然递归的数据结构,我们先简单碰一碰递归。

递归有三大要素:

  • 递归函数的参数和返回值

    确定哪些参数是递归的过程中需要处理的,那么就在递归函数⾥加上这个参数, 并且还要明确每次递归的返回值是什么进⽽确定递归函数的返回类型。

  • 终⽌条件:

    递归需要注意终止条件,终⽌条件或者终⽌条件写的不对,操作系统的内存栈就会溢出。

  • 单层递归的逻辑

    确定单层递归的逻辑,在单层里会重复调用自己来实现递归的过程。

好了,那么我们开始吧!

LeetCode144. 二叉树的前序遍历

那么先从二叉树的前序遍历开始吧。

☕ 题目:LeetCode144. 二叉树的前序遍历 (https://leetcode-cn.com/problems/binary-tree-preorder-traversal/)

❓ 难度:简单

LeetCode通关:连刷三十九道二叉树,刷疯了!⭐四万字长文搞定二叉树,建议收藏!⭐相关推荐

  1. 2021年大数据Spark(三十九):SparkStreaming实战案例四 窗口函数

    目录 SparkStreaming实战案例四 窗口函数 需求 代码实现 SparkStreaming实战案例四 窗口函数 需求 使用窗口计算: 每隔5s(滑动间隔)计算最近10s(窗口长度)的数据! ...

  2. 大数据Spark(三十九):SparkStreaming实战案例四 窗口函数

    文章目录 SparkStreaming实战案例四 窗口函数 需求 代码实现 SparkStreaming实战案例四 窗口函数 需求

  3. 【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石:几种几何体的快捷绘制法

    本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载.(这标题有些歧义的,这个几种是修饰 ...

  4. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  5. [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. 《红楼梦》-正文第三十九回名師誦読文稿

    <红楼梦>-正文第三十九回,标题:村姥姥是信口开合情哥哥偏寻根究底;正文(點聽博文誦読)如下. 话说众人见平儿来了,都说:"你们奶奶作什么呢,怎么不来了?"平儿笑道:& ...

  7. NeHe OpenGL第三十九课:物理模拟

    NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切.   物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇 ...

  8. Python编程基础:第三十九节 面向对象编程Object Oriented Programming

    第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...

  9. javaweb学习总结(三十九)——数据库连接池

    javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10 ...

  10. 三十九、Java集合中的HashSet和TreeSet

    @Author:Runsen @Date:2020/6/6 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

最新文章

  1. Java学习笔记——Java6开发WebService进阶
  2. linux 远程 i o 错误,故意在Linux中导致I / O错误?
  3. 用minGW编译ffmpeg(供替换opencv中引用的ffmpeg库)
  4. 查看命令为内置命令还是外部命令
  5. C#几个经常犯错误汇总
  6. 文献记录(part73)--基于 PCA 的信息压缩 : 从一阶到高阶
  7. python重启路由器_Python3控制路由器——使用requests重启极路由.py
  8. 信息学奥赛一本通C++语言——1109:开关灯
  9. Netty工作笔记0072---Protobuf内容小结
  10. not1,not2,bind1st,bind2nd
  11. Golang(3)CentOS7系统安装Go语言
  12. C语言中不同类型之间的混合运算
  13. 快速删除大文件利器 node 包 rimraf
  14. BBED处理RMAN-03009,ORA-1956
  15. 零售信贷产品的8大业务流程
  16. 宋宝华:LEP(Linux易用剖析器) 是什么,为什么以及怎么办(1)
  17. php百分比乘加,PHP学习笔记第一篇 基础知识
  18. Oracle undo表空间管理
  19. 老男孩mysql运维dba实战21部完整版_老男孩Mysql DBA高级运维系列课程(16部)
  20. 解决 Maven工程运行报错Failed to clean project: Failed to delete

热门文章

  1. pr如何跳到关键帧_必收藏的PR常用快捷键大全
  2. 初学者使用HTML简单做一个自我介绍
  3. oracle设置自增序列,oracle设置自增字段,oracle序列
  4. Redis技能—底层IO多路复用
  5. ab test -- 实验效果不显著的改善方法 -- CUPED
  6. 手机上python编程工具3h是_qPython 3h下载
  7. SSM+MySQL实现软件管理系统(含源码、MySQL、文档,包运行)
  8. php 汉字转拼音类,汉字与拼音转换PHP类
  9. 卢森堡携手欧洲航天局,在大公国建立独一无二的“欧洲太空资源创新中心”
  10. 数据库分页的几种实现