目录
🍺0.前言
1.树概念及结构
2.认识一棵树
3.树的表示
3.1树在实际中的运用(表示文件系统的目录树结构)
4.二叉树
4.1特殊的二叉树
4.2二叉树的性质
💎5.结束语
🍺0.前言
言C之言,聊C之识,以C会友,共向远方。各位博友的各位你们好啊,这里是持续分享数据结构知识的小赵同学,今天要分享的数据结构知识是树的概念和二叉树,在这一章,小赵将会向大家展开聊聊树的概念和二叉树。✊
1.树概念及结构
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
有一个特殊的结点,称为根结点,根节点没有前驱结点
除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
因此,树是递归定义的。
这个定义其实看起来也是很耐看的,如果我们看这个去学习二叉树,我感觉还是很有难度,那么下面小赵就用自己的语言来说一下什么叫树。
先看一下现实中的树:
我们现实中的树往往是长成这样,我们可以这样想一下就是这个根就好像是我们的磁盘,然后每个树根就好像是我们的文件夹,而每个文件里面又是不同的文件夹,这或许就是一个很好的树的概念,这样我们也能发现就是我们的树的结构在我们的计算机中是极其常见的。 至于上面所说的根节点,递归实现等,小赵会在下面和大家一一聊到。
树状结构:
当然这里还有一个特别要注意的地方即:树形结构中,子树之间不能有交集,否则就不是树形结构 。
2.认识一棵树
其实认识一个全新的东西就好像是认识全新的物质,我们要知道他长什么样子,他的每个部位叫什么,那么我们要想认识一棵树也是一样,那么下面我们就来感受一下这棵庞大的树结构。
子树:我们在树结构里的命名是很像我们人类的家族一样的,最上面一层的就好像是我们的祖先,那么子的意思其实就很像儿女的意思,那么对于A的儿女就是BCDEFG而不包含下面的那些HIJK等因为那些已经跨过了子了。
节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
叶节点或终端节点(也就是这棵树的最后):度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4(用家族的感觉就是这个家族有几代人)
堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林;
3.树的表示
树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间 的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法 等。我们这里就简单的了解其中最常用的孩子兄弟表示法。
typedef int Datatype;
struct node
{struct node* leftchild;//左孩子(左子树)struct node* rightchild;//右孩子(右子数)Datatype data;//当前节点存的数据
};
结构图:
3.1树在实际中的运用(表示文件系统的目录树结构)
树在我们计算机中的应用其实感觉和我们之前讲过的文件夹差不多,这里小赵给的是我们的linux的树状目录结构
4.二叉树
我们在目前的学习中发现树很大,很杂很多的支架,但我们今天是要学习肯定不是一个这么庞大的东西,因为太复杂了,也不好控制,所以我们今天要具体的去研究一个特殊的树,这个树就是二叉树。是一种非常完美的树,就像是我们的正方形一样好看。
现实中二叉树的样子:
我们发现这样的树在现实生活还是非常少的,所以见到这样的树,我们程序员还是非常激动的,毕竟它占据了我们数据结构中非常重要的一部分。
二叉树的概念:
一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空
2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
图形:
从上图可以看出:
1. 二叉树不存在度大于2的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的:
4.1特殊的二叉树
1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是 说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
说的更简单一点就是满了,没有空的。除了叶节点其他都有两个孩子。
2.完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
看了这个其实我还是蛮晕的,但是换个说法可能就好理解一点,就是每棵树首先一定只能有两个子树,那么就像是我们写字一样从左往右写每一行,不能中间留空,中间留一个空挡就不是完全二叉树,因为完全二叉树对左右还是非常敏感的。
4.2二叉树的性质
这里的绝大部分结论是我们可以用数学直接算出来的,这里小赵主要聊聊第三个结论。
首先是当我们只有一个根节点,然后我们开始给它一点一点节点:
各位看这个图的时候会发现,我们在增加度为1的节点的时候好像度为零的节点的个数始终没有变过都是一个,可能我们会觉得好像没什么关系,好我们接着往下。
这个时候我们把度为1的节点变为度为二的时候我们的发现每增加一个度为二就会增加一个度为零,所以结论就很明显了。度为二的节点诞生一个,度为零的节点就增加一个,再加上原本的度为零的点,那么度为零的节点就等于度为二的节点的个数加一。
💎5.结束语
好了小赵今天的分享就到这里了,如果大家有什么不明白的地方可以在小赵的下方留言哦,同时如果小赵的博客中有什么地方不对也希望得到大家的指点,谢谢各位家人们的支持。你们的支持是小赵创作的动力,加油。
如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持小赵,如有不足还请指点,小赵及时改正,感谢大家支持!!!