• 一文读懂有关Tree的前世今生


    点击关注上方“五分钟学算法”,

    设为“置顶或星标”,第一时间送达干货。

    转自景禹

    对于大量的输入数据,链表的访问时间太长,不宜使用。而树刚好就是一种极大地缩短访问时间的数据结构,其平均访问时间复杂度为O(logN)。

    鉴于有些朋友并不仅仅是因为提高自己的编程能力来学习数据结构,所以我们先来唠叨一些有关于树的基本概念和考点。

    01.

    树的基本概念

    树(Tree)是n(n>=0)个结点的有限集。当n=0时成为空树,在任意一棵非空树中:

    • 有且仅有一个特定的称为根(Root)的结点;

    • 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、...、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

    注意:

    • n>0时,根结点是唯一的,坚决不可能存在多个根结点。

    • m>0时,子树的个数是没有限制的,但它们互相是一定不会相交的。

    比如,下图中的就不符合树的定义:

    树中结点的分类:

    如图中所示,每一个圈圈我们就称为树的一个结点。结点拥有的子树数称为结点的度-(Degree),树的度取树内各结点的度的最大值。

    • 度为0的结点称为叶结点(Leaf)或终端结点;

    • 度不为0的结点称为分支结点或非终端结点,除根结点外,分支结点也称为内部结点。

    树中结点之间的关系:

    • 结点的子树的根称为结点的孩子(Child),相应的,该结点称为孩子的双亲(Parent),同一双亲的孩子之间互称为兄弟(Sibling)。

    • 结点的祖先是从根到该结点所经分支上的所有结点。

    结点的层次:

    • 结点的层次(Level)从根开始,根为第一层,根的孩子为第二层。

    • 其双亲在同一层的结点互为堂兄弟。

    • 树中结点的最大层次称为树的深度(Depth)或高度。

    02.

    树的存储结构

    不论是考试还是准备找工作面试笔试,永远记住,你理解的越多,那么你需要记住的东西就越少的道理。

    之前景禹更新过有关顺序存储结构与链式存储结构,在谈栈与队列的时候也谈到这两种存储结构,这也就是为什么所有的教材将这两种存储结构安排在最前面的缘由。关于树的存储结构同样离不开这两种存储结构。

    要存储树,简单的顺序存储结构和链式存储结构是不行滴!不过如果充分利用它们各自的特点,结合两种存储结构完全可以间接地来实现树的存储。

    双亲表示法

    • 双亲表示法,言外之意就是以双亲作为索引的关键词的一种存储方式。

    • 我们假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示其双亲结点在数组中位置的元素。

    • 也就是说,每个结点除了知道自己是谁之外,还知道它的粑粑麻麻在哪里。

    • 根结点没有双亲结点,其Parent用 -1 表示。

    这样的存储结构,我们可以根据某结点的parent指针找到它的双亲结点,所用的时间复杂度是O(1),索引到parent的值为-1时,表示找到了树结点的根。

    可是,如果我们要知道某结点的孩子是什么?那么不好意思,请遍历整个树结构。那么我们是不是可以一起改进一下呢?

    那现在我们又比较关心它们兄弟之间的关系呢?当然也是可以的:

    但是我们可以发现,这张表格中存在大量的 -1,也就是说这样的存储方式浪费了大量的存储空间,这并不是我们所期望看到的,因此,我们来看一种更高效的树的存储结构。

    孩子表示法

    将树中的每个结点的孩子结点排列成一个线性表,用链表存储起来。对于含有 n 个结点的树来说,就会有 n 个单链表,将 n 个单链表的头指针存储在一个线性表中,这样的表示方法就是孩子表示法。

    是不是瞬间感觉清爽多了,但是孩子表示法正好与双亲表示法相反,适用于查找某结点的孩子结点,不适用于查找其父结点。可以将两种表示方法合二为一,存储效果如下所示:

    孩子兄弟表示法

    使用链式存储结构存储普通树。链表中每个结点由 3 部分组成:

    通过孩子兄弟表示法,普通树转化为了二叉树,所以孩子兄弟表示法又被称为“二叉树表示法”或者“二叉链表表示法”。如下图所示:

    03.

    二叉树

    单链表

    世上树有万千种,唯有二叉课上讲。这里的二叉是二叉树,因为二叉树使用的范围最广,最具有代表意义,因此不论教材还是考试都以二叉树为主。

    二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

    这个定义显然是递归形式的,所以咱看上去有点晕,因为自古有“神使用递归,人使用迭代!“ 递归在树的相关操作中简直方便的不要不要!

    二叉树的特点

    • 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。(注意:不是都需要两棵子树,而是最多可以有两棵,没有子树或者有一棵子树也都是可以的。)

    • 左子树和右子树是有顺序的,次序不能颠倒。

    • 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树,下面是完全不同的二叉树:

    二叉树的五种基本形态

    若只从形态上来考虑,拥有三个结点的普通树只有两种情况:两层或者三层。而对于二叉树来说,由于要区分左右,所以就演变成五种形态(这也是为什么考试面试笔试总选择二叉树进行考察):

    二叉树还可以继续分类,衍生出满二叉树和完全二叉树。

    满二叉树

    如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。

    满二叉树除了满足普通二叉树的性质,还具有以下性质(请注意图中的标注):

    1. 满二叉树中第 n 层的节点数为 $2^{n-1}$ 个。

    2. 深度为 k 的满二叉树必有 $2^{k}-1$ 个节点 ,叶子数为 $2^{k-1}$。

    3. 满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶子节点都在最底层。

    4. 具有 n 个节点的满二叉树的深度为 $log_2(n+1)$。

    完全二叉树

    如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。

    完全二叉树除了具有普通二叉树的性质,它自身也具有一些独特的性质,比如说,n 个结点的完全二叉树的深度为 ⌊$log_2n$⌋+1(后面有证明)。

    ⌊$log_2{n}$⌋ 表示取小于 $log_2{n}$ 的最大整数,向下取整。例如,⌊$log_2{8}$⌋ = 3,而 ⌊$log_2{10}$⌋ 结果也是 3。

    对于任意一个完全二叉树来说,如果将含有的结点按照层次从左到右依次标号(如图上图)),对于任意一个结点 i ,完全二叉树还有以下几个结论成立:

    1. 当 i>1 时,父亲结点为结点 [i/2] 。(i=1 时,表示的是根结点,无父亲结点)

    2. 如果 2*i>n(总结点的个数) ,则结点 i 肯定没有左孩子(为叶子结点);否则其左孩子是结点 2*i 。

    3. 如果 2*i+1>n ,则结点 $i$ 肯定没有右孩子;否则右孩子是结点 2*i+1 。

    二叉树的性质(不考试的朋友可以跳过了)

    二叉树的性质一:在二叉树的第i层上至多有$2^{i-1}$个结点(i>=1)

    这个性质其实很好记忆,考试的时候懂得画出二叉树的图便可以推出

    二叉树的性质二:深度为k的二叉树至多有$2^k-1$个结点(k>=1)

    二叉树的性质三:对任何一棵二叉树T,如果其终端结点数为$n_0$,度为2的结点数为$n_2$,则$n_0$=$n_2$+1

    二叉树的性质四:具有n个结点的完全二叉树的深度为⌊log₂n⌋+1

    小禹禹们!能看到这儿,你真的很棒!今天的内容是最基础的,后面景禹会陆续更新包括树的遍历、二叉排序树、哈弗曼树、平衡二叉树、B树和B+树、红黑树的相关内容!晚安,小禹禹们!景禹原创不易,觉得不错请顺手在文末右下角点个在看,如果文中有错误,也欢迎大佬指出,谢谢你呀!帮忙转发给需要的朋友,景禹不胜感激!!!


    推荐阅读

    •   60 个相见恨晚的神器工具•   一线互联网公司技术面试的流程以及注意事项•   自学编程的八大误区!克服它!•   新手如何有效的刷算法题(LeetCode)•   10款VS Code插件神器,第7款超级实用!•   在拼多多上班,是一种什么样的体验?我tm心态崩了呀!•   写给小白,从零开始拥有一个酷炫上线的网站!


    欢迎关注我的公众号“五分钟学算法”,如果喜欢,麻烦点一下“在看”~

  • 相关阅读:
    Python全栈_Day3_网络基础
    Python全栈_Day2_操作系统基础
    Python全栈_Day1_计算机硬件
    NX二次开发-以指定字符分割字符串
    NX二次开发-获取当前项目路径
    NX二次开发-根据文件名删除文件
    NX二次开发-写入信息窗口
    NX二次开发-读文件
    NX二次开发-获取NX里的对象信息
    NX二次开发-菜单
  • 原文地址:https://www.cnblogs.com/csnd/p/16674848.html
Copyright © 2020-2023  润新知