Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于二叉树,你该了解这些!

关于二叉树,你该了解这些!

作者头像
代码随想录
修改于 2020-10-09 12:14:44
修改于 2020-10-09 12:14:44
72200
代码可运行
举报
文章被收录于专栏:代码随想录代码随想录
运行总次数:0
代码可运行

给「代码随想录」一个星标吧!

❝我们要开启新的征程了,大家跟上! ❞

说道二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容在啰嗦一遍,所以一下我讲的都是一些比较重点的内容。

二叉树的种类

在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。

满二叉树

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

如图所示:

这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。

完全二叉树

什么是完全二叉树?

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

「大家要自己看完全二叉树的定义,很多同学对完全二叉树其实不是真正的懂了。」

我来举一个典型的例子如题:

相信不少同学最后一个二叉树是不是完全二叉树都中招了。

「之前我们刚刚讲过优先级队列其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系。」

二叉搜索树

前面介绍的书,都没有数值的,而二叉搜索树是有数值的了,「二叉搜索树是一个有序树」

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉排序树

下面这两棵树都是搜索树

平衡二叉搜索树

平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

如图:

最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。

「C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树」,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_map底层实现是哈希表。

「所以大家使用自己熟悉的编程语言写算法,一定要知道常用的容器底层都是如何实现的,最基本的就是map、set等等,否则自己写的代码,自己对其性能分析都分析不清楚!」

二叉树的存储方式

「二叉树可以链式存储,也可以顺序存储。」

那么链式存储方式就用指针, 顺序存储的方式就是用数组。

顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在散落在各个地址的节点串联一起。

链式存储如图:

链式存储是大家很熟悉的一种方式,那么我们来看看如何顺序存储呢?

其实就是用数组来存储二叉树,顺序存储的方式如图:

用数组来存储二叉树如何遍历的呢?

「如果父节点的数组下表是i,那么它的左孩子就是i * 2 + 1,右孩子就是 i * 2 + 2。」

但是用链式表示的二叉树,更有利于我们理解,所以一般我们都是用链式存储二叉树。

「所以大家要了解,用数组依然可以表示二叉树。」

二叉树的遍历方式

关于二叉树的遍历方式,要知道二叉树遍历的基本方式都有哪些。

一些同学用做了很多二叉树的题目了,可能知道前中后序遍历,可能知道层序遍历,但是却没有框架。

我这里把二叉树的几种遍历方式列出来,大家就可以一一串起来了。

二叉树主要有两种遍历方式:

  1. 深度优先遍历:先往深走,遇到叶子节点再往回走。
  2. 广度优先遍历:一层一层的去遍历。

「这两种遍历是图论中最基本的两种遍历方式」,后面在介绍图论的时候 还会介绍到。

那么从深度优先遍历和广度优先遍历进一步拓展,才有如下遍历方式:

  • 深度优先遍历
    • 前序遍历(递归法,迭代法)
    • 中序遍历(递归法,迭代法)
    • 后序遍历(递归法,迭代法)
  • 广度优先遍历
    • 层次遍历(迭代法)

在深度优先遍历中:有三个顺序,前中后序遍历, 有同学总分不清这三个顺序,经常搞混,我这里教大家一个技巧。

「这里前中后,其实指的就是中间节点的遍历顺序」,只要大家记住 前中后序指的就是中间节点的位置就可以了。

看如下中间节点的顺序,就可以发现,中间节点的顺序就是所谓的遍历方式

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

大家可以对着如下图,看看自己理解的前后中序有没有问题。

最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。

「之前我们讲栈与队列的时候,就说过栈其实就是递归的一种是实现结构」,也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的。

而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。

「这里其实我们又了解了栈与队列的一个应用场景了。」

具体的实现我们后面都会讲的,这里大家先要清楚这些理论基础。

二叉树的定义

刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。

C++代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子.

这里要提醒大家要注意二叉树节点定义的书写方式。

「在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。」

因为我们在刷leetcode的时候,节点的定义默认都定义好了,真到面试的时候,需要自己写节点定义的时候,有时候会一脸懵逼!

总结

二叉树是一种基础数据结构,在算法面试中都是常客,也是众多数据结构的基石。

本篇我们介绍了二叉树的种类、存储方式、遍历方式以及定义,比较全面的介绍了二叉树各个方面的重点,帮助大家扫一遍基础。

「说道二叉树,就不得不说递归,很多同学对递归都是又熟悉又陌生,递归的代码一般很简短,但每次都是一看就会,一写就废。」

「那么请跟住Carl的节奏,不仅彻底掌握二叉树的递归遍历,还有迭代遍历!」

往期精彩回顾

双指针法:总结篇!

栈与队列:总结篇!

栈与队列:求前 K 个高频元素和队列有啥关系?

栈与队列:滑动窗口里求最大值引出一个重要数据结构

栈与队列:有没有想过计算机是如何处理表达式的?

栈与队列:匹配问题都是栈的强项

栈与队列:系统中处处都是栈的应用

栈与队列:用队列实现栈还有点别扭

栈与队列:我用栈来实现队列怎么样?

栈与队列:来看看栈和队列不为人知的一面

本文:https://github.com/youngyangyang04/leetcode-master​已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!

我是程序员Carl,哈工大师兄,先后在腾讯和百度从事技术研发多年,利用工作之余重刷leetcode。

我的B站(里面有我讲解的算法视频以及编程相关知识):https://space.bilibili.com/525438321

我的githubhttps://github.com/youngyangyang04

更多 精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我  微信,备注「个人简介」+「组队刷题」,拉你进入刷题群(无任何广告,纯个人分享),每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码随想录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于二叉树,你应该了解这些。(二叉树的理论基础)
推荐视频——关于二叉树,你该了解这些!| 二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
半生瓜的blog
2023/05/12
1650
关于二叉树,你应该了解这些。(二叉树的理论基础)
二叉树:总结篇!(需要掌握的二叉树技能都在这里了)
不知不觉二叉树已经和我们度过了「三十三天」,代码随想录里已经发了「三十三篇二叉树的文章」,详细讲解了「30+二叉树经典题目」,一直坚持下来的录友们一定会二叉树有深刻理解了。
代码随想录
2020/10/30
8610
二叉树:总结篇!(需要掌握的二叉树技能都在这里了)
再也不用怕面试问二叉树了
二叉树是一种非常重要的数据结构。在算法题中经常会使用到,在面试中的占比也是非常大的。
不作声
2020/10/15
3220
再也不用怕面试问二叉树了
二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它 叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继,因此,树是递归定义的。
走在努力路上的自己
2024/01/26
2.9K0
二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
二叉树的基础---四种遍历方式的 Java 实现
大家好,我是多选参数的程序锅,一个正在“研究”操作系统、学数据结构和算法以及 Java 的硬核菜鸡。本篇将带来的是二叉树的相关知识,知识提纲如图所示。
syy
2020/07/27
2K0
基本数据结构概念
一、线性结构 顺序存储线性表:将元素依次存储在地址连续的存储单元中,物理上相邻; 链式存储线性表:将元素按照逻辑顺序链接在依次,不要求地址连续; 栈:仅在表的一端进行插入、删除操作的线性表,“后进先出”; 队列:仅在表的一端进行插入,另一端进行删除的线性表,“先进先出” 栈和队列有时候笔试会针对”FIFO“这些特性出问题,不过一般理解了,就比较简单。 二、树 2.1概念 二叉树是每个节点最多有两个子树(“左子树”和“右子树”)的树结构。 满二叉树:二叉树的每一层节
xiangzhihong
2018/02/01
5060
基本数据结构概念
二叉树入门就是这么简单!
自知技术有限,不过凭借着对编程的喜爱与兴趣,坚持发表一些文章,或在大神眼中,确实微不足道,也或许能给一些朋友一些启发,由于个人技术的不足,或许文章中会出现一些不足或错误之处,非常感谢大家能不吝指出,坚持写作大半年了,虽说没有什么显著的成就,但是一篇篇文章也给了我满满的记忆,作为一名普通本科的在校学生,每天坚持写一些东西,去做图,去写代码,去看一些书籍,找一些资料,帮助自己理解,再想想如何用自己的语言总结,归纳一下。技术的局限,有时候总会遇到一些盲区,写出来的文章,总是过于叙事化,理论化,缺乏实际经验,本地所模拟的一些例子,可能并不是很合理,也没有那么使用,但我也在尽量的弥补与实际开发应用的距离,总而言之,感谢各位支持,也感谢帮助过我的一个人。
BWH_Steven
2019/11/12
8270
二叉树入门就是这么简单!
关于二叉树,你该了解这些......
说道二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容在啰嗦一遍,所以一下我讲的都是一些比较重点的内容。
代码随想录
2021/07/16
4600
数据结构——二叉树
树是一种非线性的数据结构,它是由n个有限节点组成的具有层次关系的集合。每一个节点代表一个元素,由父节点和子节点的层次关系连接。它被叫做树的原因是因为看起来像一颗倒挂的树(根朝上,叶子朝下)。
HZzzzzLu
2024/11/26
1300
数据结构——二叉树
令你头疼的[树]
The first step to accepting yourself is to stop comparing yourself to others.
小闫同学啊
2019/07/18
5620
令你头疼的[树]
LeetCode通关:连刷三十九道二叉树,刷疯了!
大家好,我是拿输出博客来督促自己刷题的老三,这一节我们来刷二叉树,二叉树相关题目在面试里非常高频,而且在力扣里数量很多,足足有几百道,不要慌,我们一步步来。我的文章很长,你们 收藏一下。
三分恶
2021/09/08
8580
讲透学烂二叉树(四):二叉树的存储结构—建堆-搜索-排序
数据结构是组织数据的方式,例如树,但是要注意数据结构有两种形式:逻辑结构和存储结构,这两种结构在表示一种数据结构的时候不一定完全相同的,逻辑结构是我们分析数据结构和算法的主要形式,而存储结构则是数据结构在内存中的存储形式。
周陆军
2021/08/15
1.2K0
【树】之二叉树(C语言)(含图解)
树是一种非线性的数据结构,它是由n(n >= 0)个有限结点组成的一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
半生瓜的blog
2023/05/12
5410
【树】之二叉树(C语言)(含图解)
二叉树:数据结构的分形之美
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把他叫做树是因为它看起来像一棵倒挂的树,也就说它的根朝上,而叶朝下的。它具有以下的特点:
用户11070251
2024/05/04
1560
二叉树:数据结构的分形之美
【数据结构】树与二叉树(八):二叉树的中序遍历(非递归算法NIO)
  二叉树是一种常见的树状数据结构,它由结点的有限集合组成。一个二叉树要么是空集,被称为空二叉树,要么由一个根结点和两棵不相交的子树组成,分别称为左子树和右子树。每个结点最多有两个子结点,分别称为左子结点和右子结点。
Qomolangma
2024/07/30
2600
【数据结构】树与二叉树(八):二叉树的中序遍历(非递归算法NIO)
数据结构——二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
Eternity._
2024/06/14
1100
数据结构——二叉树
精读《算法 - 二叉树》
二叉树是一种数据结构,并且拥有种类复杂的分支,本文作为入门篇,只介绍一些基本二叉树的题型,像二叉搜索树等等不在此篇介绍。
黄子毅
2022/03/15
3170
前端学数据结构与算法(六):二叉树的四种遍历方式及其应用
上一章我们从0到1的实现了一颗二叉搜索树,以及理解了二叉搜索树的特性与基本操作,这一章介绍关于二叉树的更多操作,也就是树的遍历。主要包括前序遍历、中序遍历、后序遍历、层序遍历,前面三种也叫深度优先遍历(DFS),最后的层序遍历也叫广度优先遍历(BFS),理解这四种遍历方式的不同,再遇到树相关的算法问题时,也就能更加游刃有余。这里不单指二叉搜索树,遍历思想同样适用于多叉树。
飞跃疯人院
2020/10/07
1.2K0
【愚公系列】2023年11月 数据结构(八)-二叉树
数据结构是计算机科学中的一个重要概念,它描述了数据之间的组织方式和关系,以及对这些数据的访问和操作。常见的数据结构有:数组、链表、栈、队列、哈希表、树、堆和图。
愚公搬代码
2023/11/07
3260
数据结构:图文详解二叉树(遍历、类型、操作)
从根节点出发,按照某种次序访问二叉树中的所有结点,使得每个结点被访问1次 且 只被访问1次
Carson.Ho
2020/01/13
7140
数据结构:图文详解二叉树(遍历、类型、操作)
推荐阅读
相关推荐
关于二叉树,你应该了解这些。(二叉树的理论基础)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验