数据结构(十) -- C语言版 -- 树 - 基础知识

零、读前说明

  • 本文中没有涉及到很多的相关理论知识,也没有做深入的了解,所以,您如果是想要系统的学习、想要多学习关于理论的知识等,那么本文可能并不合适您。
  • 本文中所有设计的代码均通过测试,并且在功能性方面均实现应有的功能。
  • 设计的代码并非全部公开,部分无关紧要代码并没有贴出来。
  • 如果你也对此感兴趣、也想测试源码的话,可以私聊我,非常欢迎一起探讨学习。
  • 由于时间、水平、精力有限,文中难免会出现不准确、甚至错误的地方,也很欢迎大佬看见的话批评指正。
  • 嘻嘻。。。。 。。。。。。。。收!

一、树的定义

  树的图示可以用下面的这个图图来表示。
  

在这里插入图片描述

图1.1 树的简单表示形式

  

  1、第一种定义

  由一个或者多个(n≥0)节点组成的有限集合T,有且仅有一个节点成为树根(root),当n>1时候,其余的节点可以分为m(m≥0)个互不相交的有限集合T1,T2,…Tm。每个集合的本身又是树,被称为这个树的子树(subtree)。

  2、第二种定义

  树(tree)是包含n(n≥0)个结点的有穷集合,其中:
  (1)每个元素称为结点(node);
  (2)有一个特定的结点被称为根结点或树根(root)。
  (3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1 <= i <= m)本身也是一棵树,被称作原树的子树(subtree)。

  3、树的递归定义

  单个结点是一棵树,树根就是该结点本身。
  设T1,T2,…,Tk是树,它们的根结点分别为n1,n2,…,nk。
  用一个新结点n作为n1,n2,…,nk的父亲,则得到一棵新树,结点n就是新树的根。
  我们称n1,n2,…,nk为一组兄弟结点,它们都是结点n的子结点。
  我们还称T1,T2,…,Tk为结点n的子树。

  4、树的总结定义(自己总结的,不一定完全准确)

  (1)由节点和指针组成
  (2)有且只有一个节点没有父节点,但是有多个子节点,此节点称为是根节点(root)
  (3)除了根节点,其余每一个节点只能有一个父节点,但可以有多个子节点
  (4)每个节点必须互不相交

  综上所述呢。其实按照实际的来说的话,我觉得把这个形象的东西称为葡萄更为形象。

二、树中的概念

  • 空集合也是树,称为空树。空树中没有结点。
  • :也就是根节点,没有前驱。 比如A
  • 叶子:也就是终端节点,没有后继。 比如K ,L,M
  • 森林:指的是多个不相交的树的集合,比如下图中所示。

  在这里插入图片描述

图2.1 森林表示形式
  

  • 有序树:节点各个子树从左到右有顺序关系,也称为自由树,不能互换。 比如 K, L,不可互换
  • 无序树:与有序树相反,可以互换的。 比如 K, L,可互换
  • 双亲节点:上层的那个节点,也是直接的前驱。 比如E为K,L的双亲
  • 孩子节点:下层的节点的子树,也是直接后继。 比如K,L为E的孩子
  • 兄弟节点:同一双亲下的同一层的节点(孩子之间互称兄弟)。 比如E,F为兄弟
  • 堂兄弟节点:双亲位于同一层的节点,但是并非同一个双亲。 比如E和G为堂兄弟
  • 祖先:从根节点到该节点所经分支的所有节点。 比如K的祖先有E,B等
  • 子孙:该节点下层子树中的任意一个节点。 比如E的子孙有K,L等
  • 节点:树的数据元素。 比如B,C,D等
  • 节点的度:一个节点含有的子节点的个数称为该节点的度,有几个直接的后继就是几个度 ,也称为次数。 比如B节点的度为2(E,F两个节点)
  • 树的度:所有节点中毒度最大的节点的度。 比如上图的树中,A节点的度为3,D节点的度为3,所以整个树的度为3
  • 树的深度:树中节点的最大层次,也称为树的高度。 上图中的树的层数为4,所以树的深度为4
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  • 二叉树:每个节点最多含有两个子树的树称为二叉树;
  • 完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

  在这里插入图片描述

图2.2 完全二叉树表示形式
  

  • 满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。

  
在这里插入图片描述

图2.3 满二叉树表示形式

  

  • 哈夫曼树:带权路径最短的二叉树,权值较大的结点离根较近,也称为最优二叉树。

  
在这里插入图片描述

图2.4 哈夫曼树的表示形式

  

三、树的表示法

  • 图形表示法

  这是最简单、最直观的一种表示方法,上面使用的示意图就是图形表示法。下面的表示可以方便的指出根节点子树叶子节点等。

  

图3.1 树的图形表示法

  

  • 广义表示法

  这种表示法主要是将根作为由子树森林组成的表的名字写在表的左边。比如形象的表示中国的城市样子。

中国(北京(海淀,朝阳,西城),广东(佛山,东莞),上海)

  这种标识方法比较符合人们标识习惯,但是不方便于编程。
  
在这里插入图片描述
  

图3.2 树的广义表示法

  

  • 左孩子-右兄弟表示法

在这里插入图片描述

图3.3 树的左孩子-右兄弟表示法

  

  通过此种表示的方法,则可以将一个比较复杂的树转换成一个二叉树,那就是这样的了。
  
在这里插入图片描述

图3.4 树的左孩子-右兄弟表示法转换二叉树

  

  • 嵌套集合表示法

  这种表示方法就像在数学中表示集合的方式,其中表示的形式为下图所示。

  
在这里插入图片描述

图3.3 树的嵌套集合表示法

  

  • 目录表示法

  很形象的一种表示方式,就像书中的目录这样,带有归属的层次感。
  
在这里插入图片描述

图3.4 树的目录表示法

  

四、树的特点

  • 非线性结构
  • 一个直接前驱,但可能有多个直接后继
  • 单只有一个根节点,
  • 也就是为 1对多 的关系
  • 并且子树之间互不相交。

  好了,关于二叉树的基础知识就暂时先写到这儿,那既然你都看到了这儿呢,说明你还是一个热爱学习的最靓的崽啦,看在作者我呢写作总结不容易,动动你发财的小手手给点个赞啦,要是能关注一波那就更好啦!(疯狂暗示的眼神ing…)
  
在这里插入图片描述

  
  啦啦啦,撒花完结!

上一篇:数据结构(  九  ) – C语言版 – 栈和队列 - 队列的特殊实现
下一篇:数据结构(十一) – C语言版 – 树 - 二叉树基本概念

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青椒*^_^*凤爪爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值