树和二叉树的概念

闲聊 闲聊 1535 人阅读 | 0 人回复

<
文章目次



媒介

  陆连续绝的,我们曾经教完了序次表,链表,栈战行列等线性的数据构造,现在天专次要引见的便是树形的数据构造,战线性数据构造一样,我们先引见甚么是树形构造和树的特性

树的观点

树是一种非线性的数据构造,它是由n(n>=0)个有限结面构成一个具有层次干系的汇合。把它叫做树是果
为它看起去像一棵倒挂的树,也便是道它是根晨上,而叶晨下的

以下图所示:
144940mwtr4jldigjnhw64.png
  上面是引见树的一些经常使用术语观点,专主先上一张图,便利各人辨别各个术语
144941dvcy0m3i20wbw6dz.png


  • 根结面:出有单亲节面的结面,好比结面A.
  • 孩子节面或子节面:一个节面露有的子树的根节面称为该节面的子节面; 如B是A的孩子节面
  • 单亲结面若一个节面露有子节面,则那个节面称为其子节面的女节面,如A是B的女节面
  • 节面的度:一个节面露有的子树的个数称为该节面的度; 如A的度为6

    • 144941x3i04hirrsam96or.png


  • 叶节面或末端节面度为0的节面称为叶节面, 如B、C、H、I等节面为叶节面
  • 非末端节面或分收节面度没有为0的节面; 如D、E、F、G等节面为分收节面
  • 兄弟节面具有不异单亲节面的节面互称为兄弟节面; 如I,J是兄弟结面,K,L,M是兄弟结面,H,I没有是兄弟结面
  • 树的度一棵树中,最年夜的节面的度称为树的度; 如树的度为6(由于A的度是一切结面中度最年夜的,成果为6)
  • 节面的层次从根开端界说起,根为第1层,根的子节面为第2层,以此类推;
  • 树的下度或深度树中节面的最年夜层次; 如上里的树的下度为4(即具有四层)
  • 节面的先人从根到该节面所经分收上的一切节面;如上图:A是一切节面的先人
  • 子孙以某节面为根的子树中任一节面皆称为该节面的子孙。如上图:一切节面皆是A的子孙

树的暗示

  前里俭朴引见了树的观点,可是树究竟结果是逻辑构造,我们念要完成它,该怎样做呢?最经常使用的是借助链表,用孩子兄弟暗示法停止归纳树构造.以下图:
144942bg70zpilgfp76k0p.png
结面的代码构建以下:
  1. typedef int DataType;
  2. typedef struct node
  3. {
  4.     struct node* child;       //指背左孩子结面
  5.     struct node* brother;     //挨个指背兄弟结面
  6.     DataType data;            //存储当前结面数据
  7. }node;
复造代码

树构造正在实践中的使用

  树构造正在实践糊口中使用最多的便是文件构造,以下表示图:
144942e99in6nask3g6gaf.png
两叉树的观点

  契合树的观点,但特性是树的度最年夜只能为2,也便是道每一个结面的子节面最多只能有两个.
两叉树特性:


  • 每一个结面最多有两棵子树,即两叉树没有存正在度年夜于2的结面。
  • 两叉树的子树有阁下之分,其子树的次第不克不及倒置。
144943e7cjr6bh9ba9snw1.png

特别的两叉树

谦两叉树

  **观点:**每层的结面皆抵达最年夜值,且第n层的结面数量契合公式2^(n-1),层数是从1开端数
144944z3ftnag3gcgzfdzd.png
完整两叉树

  观点: 关于层数(n>=2)的树,其n-1层契合谦两叉树,第n层结面数量必需从左背左皆契合222...1特征,即有且只要1个单结面,地位处于开端,该单结面必然是左孩子结面.
144944swlmbotnmvlmmobi.png
两叉树性子


  • 若划定根节面的层数为1,则一棵非空两叉树的第n层上最多有2^(n-1) 个结面.
  • 若划定根节面的层数为1,则深度为h的两叉树的最年夜结面数是2^h- 1(该公式由等比数列乞降获得).
  • 若划定根节面的层数为1,具有n个结面的谦两叉树的深度h=Log2(n+1)
  • 尽情一颗两叉树,假定度为0的结面数量为n0,度为2的结面数量为n1,则合意 n0= n1+1;
两叉树的存储构造

序次存储

  即用数组停止存储,正在逻辑构造上是两叉树,正在物理构造上是一个数组,用数组的下标停止暗示每一个结面,从0开端,以下图:
144945oyqyr8cxqctzw8wq.png
  序次存储的特性:
  

  • 只合用两叉树,由于两叉树请求即便空结面也存储,以是空间没有会华侈,可是其他树构造便会形成严峻空间华侈
  • 序次存储两叉树普通合用于堆排序
链式存储

链式存储有两种:


  • 两叉链:具有三个域,别离是阁下指针域战数据域,阁下指针域别离指背左孩子战左孩子
  • 三叉链:具有四个域,别离是阁下指针域和单亲域战数据域,阁下指针域同上,单亲域指背单亲节面.
表示图以下:
144945tyva9n4uan371n1h.png

两叉链结面构建代码:
  1. typedef int DataType;
  2. typedef struct node
  3. {
  4.     struct node* leftchild;
  5.     struct node* rightchild;
  6.     Datatype data;
  7. };
复造代码
三叉链结面构建代码:
  1. typedef int DataType;
  2. typedef struct node
  3. {
  4.     struct node* leftchild;
  5.     struct node* rightchild;
  6.     Datatype data;
  7. };
复造代码

熟悉树构造的习题锻炼

  1. 1. 某两叉树共有 399 个结面,此中有 199 个度为 2 的结面,则该两叉树中的叶子结面数为( )
  2. A 没有存正在如许的两叉树
  3. B 200
  4. C 198
  5. D 199
  6. 2.以下数据构造中,没有合适接纳挨次存储构造的是( )
  7. A 非完整两叉树
  8. B 堆
  9. C 行列
  10. D 栈
  11. 3.正在具有 2n 个结面的完整两叉树中,叶子结面个数为( )
  12. A n
  13. B n+1
  14. C n-1
  15. D n/2
  16. 4.一棵完整两叉树的节面数位为531个,那末那棵树的下度为( )
  17. A 11
  18. B 10
  19. C 8
  20. D 12
  21. 5.一个具有767个节面的完整两叉树,其叶子节面个数为()
  22. A 383
  23. B 384
  24. C 385
  25. D 386
复造代码
  谜底:
  

  • B,缘故原由两叉树中 叶子结面数量 = 度为2结面数量 + 1
  • C,由于序次构造的长处是 尾删尾插便利,可是行列用的更多的是 头插头删
  • A,一颗谦两叉树的结面数量是2n-1,如今一切结面是2n,相等于正在谦两叉树后增长了一个结面.以是为n
  • B,2^9的成果是512,是一个谦两叉树,531比512多19个结面,以是下度是10.
  • B,前9层是谦两叉树结面有512,盈余255叶节面,可是那255个结面有254个结面有单亲,即有127个度为2结面,然后前8层的结面皆是度为2结面,2^8-1便是255,以是度为2的结面为255+127=382,那末剩下的结面为767-382=385(包罗叶节面战一个度为1结面),以是谜底是384

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则