数据结构原来这个叫树

Posted 一个正直的男孩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构原来这个叫树相关的知识,希望对你有一定的参考价值。

树是啥,现实中的树吗,是这个小王子里面的猴面包树??

又或者是北欧神话里面的世界树

其实不是,在计算机中,树是一种数据结构,他的逻辑结构呈现了一棵树的状态,如图:

这个看着像北欧神话里面的世界树根呀,对其实也可以看成树的根,或是倒过来的树
如图:

在生活中树的结构也无处不在,比如常用的思维导图,家里的族谱,计算机的文件系统……



  • 树是一种非线性存储的结构
  • 且树的节点个数是 ≥0 的, 等于0则为空树
  • 根有且只有一个

树的概念

  • 父节点
  1. 他含有儿子(含有子节点)
  • 节点的度
  1. 有多少个儿子(该节点有多少个子节点)
  • 叶节点or终端节点
  1. 孤寡老人(他没有儿子,度为 0 )
  • 兄弟节点
  1. 同一个爹生的就是(俩子节点都指向同一个父节点)
  • 堂兄弟节点
  1. 同辈兄弟不是一个爹生的(同一层上面的节点,但不是同一个父节点)
  • 祖先节点
  1. 就是根节点
  • 树的度
  1. 祖先有多少个儿子(祖先节点有多少个子节点)
  • 树的深度
  1. 家族到了第几代了(有多少层)
  • 子孙节点
  1. 除根节点以外的都是
  • 森林
  1. 一棵树叫树,那么多棵树那么就是森(且不相交)



图解:

注:
这儿一个孩子 只有一个父亲(不可以认别认做干爹),反之父亲节点也不可以认干儿子,




既然树是一种数据结构那么他是如何存储的呢?

树的存储

树是如何存储的呢?他是非线性的如何存,上图看着似乎不太好存,用顺序表吗?或者用链表吗?单单用简单的顺序表与链表是无发体现出树的逻辑结构毕竟之前顺序表与链表似乎每个节点后面都只有一个,如果是单节点的树(后面会说到)用顺序表真的是完美,可是他有多个孩子咋办

这里就有一种方法可以解决叫做双亲表示法

双亲表示法:
父节点只存他左边的孩子的地址(第一个孩子),然后左孩子指向他旁边的兄弟节点,如此反复,如果没有兄弟那么就指向空


图解结构

左边为逻辑结构 ,右边为物理结构


双亲表示法的结构代码
typedef  int DataType
struct Node
{
   struct Node*firstChild;//一层里面第一个孩子(左孩子)
   struct Node*borther;//其他亲兄弟节点
   DataType data;//数据
}


二叉树


树里面有一种特殊的树,二叉树,是啥样的呢?怎么理解吧,前面的树是计划生育前,你想要几个孩子都可以,计划生育后你最多只能有俩个孩子如图:

上面看到其实不是每一个节点都是俩个(现实中一个孩子的也很多,家里独宠),其实以下情况也是二叉树


二叉树中里有俩特殊二叉树

满二叉树 完全二叉树


上图对比可以得出完全二叉树其实就是节点不是满的,且完全二叉树也是严格要求的,他的节点之间必须挨着存放的,错误与正确示范如图:



二叉树和树一样也有一些定义

  • 节点个数的计算
    2(H)-1 h为二叉树的深度or高度
  1. 二叉树个数就和卵细胞分裂类似但是差点,二叉树第一层只有一个节点,而细胞分裂一次就是俩个所以公式是2H-1

如图:

  • 二叉树的高度计算
    log2(n+1)->这里的log是以二为底(一些书中会写成lgN+1),n为节点个数
    这儿就和上面是差不多就是反过推就好了
  • 叶子节点的计算
    N0=N2+1,N0为叶子节点,而N2为度为2的节点,知道N0的节点也可以反推N2的节点个数

如图:

  • 完全二叉树的最少/最多,有多少个节点
    最少与最多的情况:

如图:

由上面可以看出满二叉树其实也是完全二叉树是最多的情况(公式如上),那么最少的情况如何算呢: 2(H-2):

2(H-1) 就是从完全二叉树那里推出来的,满二叉树公式2(H)-1,最少的情况比他少一层,所以高度减1,但他必须有一个节点所以要加回去2(h-1)+1-1 -->2(H-1)

  • 第i层的节点个数:
    2(i-1) 假设我们要求第一层的节点 2^(1-1)=1, 因为层数是从 1 开始而节点个数的指数是从 0所以减一


切瓜环节


某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199

在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
An
B n+1
C n-1
D n/2

一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
A 11
B 10
C8
D 12

一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386


  • 第一题B,度为 2 的节点有199,求叶子节点,知道度为二的节点求叶子,套用公式犹如砍菜切瓜N0=N2+1

  • 第二题A,这道推理题且要记住一个公式 N0+N2+N1=N (N0叶子,N2度为二的节点……)

图解:


  • 第三题B,求树的高度还告诉了你节点个数,你说说这是啥,送分题呀,套公式log(N+1)–>log(531) 210=1024 29=512

  • 第四题B,通过上面推导得出N0+N1+N2=N,且N1=节点奇数为0,偶数为1
  • 2N0+N1=767 2N=767


学到这里对树已经有一个基础的认识了,可以算是下了一个新的副本的前几层,显然副本的难度并不是很高,这里算是暴风前的宁静了,下一层就是boss就是(顺序表二叉树):堆,下下层为究极boss(链式二叉树),递归,记得拾起装备迎接后续的挑战

以上是关于数据结构原来这个叫树的主要内容,如果未能解决你的问题,请参考以下文章

图解数据结构树和二叉树全面总结

Unity报错:Read only asset Packages/com.xxxxx.xxx.xxxx/Editor/VSCodeDiscovery.cs.IPGSD has no meta(代码片段

Unity报错:Read only asset Packages/com.xxxxx.xxx.xxxx/Editor/VSCodeDiscovery.cs.IPGSD has no meta(代码片段

为啥这个代码片段说包含错误?

这个代码片段究竟做了啥?

从零开始配置vim(27)——代码片段