快速上手 C++ 数据结构与算法
王健伟
《C++ 新经典》系列作者,资深 C++ 讲师
3224 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
结束语 (1讲)
快速上手 C++ 数据结构与算法
15
15
1.0x
00:00/00:00
登录|注册

10|二叉树:二叉树到底长什么样子?

你好,我是王健伟。
前面讲解过的线性表,是以线性结构来组织数据的,数据之间只是简单的前后次序关系。但问题在于,线性结构对数据的组织结构过于单一,对于数据的访问速度也过于缓慢,在一些复杂的应用领域中,这种简单的线性结构不足以表达问题。
这个时候,我们就要引入“树形结构”这个概念了。
树形结构的应用场合非常多,比如计算机某块硬盘下的目录结构、一个公司的组织架构划分、一个家族的族谱等等。在计算机领域,树形结构也被广泛应用,比如编译器、数据库里都会用到,也因此,树形结构非常重要。而在众多树形结构中,最常用的一种,就是二叉树了。

树形结构的基本概念

在日常生活中,树是一种随处可见的植物,它由树根、树枝、树叶这些主要结构组成。而“树形结构”,就是基于日常生活中的树而得名的一种非线性数据结构。
什么是“非线性的数据结构”?想象一下,一根树枝可以分叉出很多树枝、树叶,我们也可以将“非线性的数据结构”理解成一种一对多的关系,而不是像一条线一样,按顺序排列的一对一关系。
在绘制树这种数据结构时,人们往往会从上向下绘制,也就是将树根绘制在最上面,图 1 就是一棵树:
图1 树
在这幅图中,所有标有字母的圆圈就是树的节点。树(Tree)是 n(n≥0)个节点的有限集。这里有了一个限定范围,n≥0。你可以尝试想象几种不同的情况,比如 n=0,n=1,以及 n>1 这三种。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了二叉树的基本概念和特点,包括满二叉树、完全二叉树和斜树等特殊形态。满二叉树具有所有分支节点都存在左右子树和叶节点在同一层的特点,而完全二叉树则在叶节点排列上有特殊要求,并且与满二叉树有着对应关系。此外,文章还介绍了左斜树和右斜树的特点,它们每一层只有一个节点,看起来更像线性表。通过对这些特殊形态的介绍,读者可以快速了解二叉树的基本概念和特点,为进一步深入学习和应用提供了基础。文章还介绍了二叉树的性质,包括节点数量与度数的关系、完全二叉树的高度计算方法以及节点编号规则等。这些性质对于后续编写程序时的内存空间分配、二叉树的高度和节点数量计算以及节点关系的查找具有重要的指导意义。总之,本文内容丰富,既有理论知识又有实际应用,对于初次接触树形数据结构的读者来说,是一篇值得深入阅读和学习的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快速上手 C++ 数据结构与算法》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:有序是指什么? 从左到右有序,这个有序是根据什么? Q2:节点不需要包含指向其父节点的指针(或索引)吗? Q3:C++的库是否封装了对二叉树的操作?

    作者回复: A1:有序可以理解为根据数字大小。学下去我们会知道,一个节点一般保存的是个数字,很多二叉树中要求节点左孩子的数字要比该节点数字小,该节点右孩子的数字要比该节点数字大。左右孩子节点不能互换否则就变成左孩子节点数字比该节点数字大,右孩子节点数字比该节点数字小,那就乱套了。 A2:节点是否有指向父节点的指针依据需求而定,并不是说非要有。比如后面我们讲解红黑树时就会增加指向父节点的指针这一项,因为涉及到调平衡,有父节点指针会方便很多。 A3:C++标准库中有用到二叉树这种数据结构,比如map容器用的就是二叉树中的红黑树。你使用时感受不到用了二叉树,我确实没听过谁封装针对二叉树操作的接口。我们学习这些原理性的东西,两个目的:一是提振自己信心,更好的使用诸如map这种用到了树行结构的容器。二是应付面试,找到工作。

    2023-03-07归属地:北京
    1
  • Bruder_Jin
    思考题:“度为 2 的有序树”与“二叉树”的区别是什么? 我的答案: (1)度为2的有序树是不区分左子树和右子树,而二叉树是要分左子树和右子树的。 理解:①有序树的结点次序是相对于另一结点而言的,如果有序树中的子树只有一个孩子时,这个孩子结点就无须区分其左右次序。②二叉树无论其孩子数是否为2,均需确定其左右次序,也就是说二叉树的结点次序不是相对于另一结点而言而是确定的。比如:如果二叉树中的某节点子树只有一个孩子时,这个孩子结点必须区分是左孩子还是右孩子。 (2)度为2的有序数不包含空树,而二叉树是可以有空树的。 理解:①度为2的有序树不存在度大于2的结点,且一定要存在某节点的度为2。②二叉树有五种基本形态:空二叉树、仅有根节点的二叉树、左子树为空的二叉树、右子树为空的二叉树、左右子树均不为空的二叉数;即二叉树也不允许存在度大于2的节点,但是不要求必须存在度为2的节点。 以上是我的理解……烦请作者大大指正不足之处

    作者回复: 挺好,要对自己有信心。也可以使用chatgpt进一步帮助自己补充和完善答案。

    2023-06-05归属地:广东
  • Bruder_Jin
    您好!性质五的第一个式子推导的图片中第三行字有误吧! 【原文】:“因此,再次根据性质二,前 k -1层有2^(k)-1个节点,那么高度为 k 的完全二叉树的节点数量一定大于2^(k-1)-1。” 【应该是】:“因此,再次根据性质二,前 k -1层有2^(k-1)-1个节点,那么高度为 k 的完全二叉树的节点数量一定大于2^(k-1)-1。”

    作者回复: 说的很对已通知同事修改

    2023-06-05归属地:广东
  • Tokamak
    满二叉树的特点中,不存在度为非 0 和非 2 的节点;这个是写错了吧,叶节点的度就是0呀,除叶节点外其他节点的度都是2呀。

    作者回复: 对呀,叶节点度为0,其他节点度为2。所以不存在度为非0非2的节点(注意这里的“非”字)。这个描述以及你所说的是同样的结论呀。

    2023-03-20归属地:上海
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部