22计算机408考研—数据结构—树的基本概念

242 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

手把手教学考研大纲范围内树定义,遍历,Huffman,并查集 22考研大纲数据结构要求的是C/C++,笔者以前使用的都是Java,对于C++还很欠缺, 如有什么建议或者不足欢迎大佬评论区或者私信指出 初心是用最简单的语言描述数据结构

Talk is cheap. Show me the code. 理论到处都有,代码加例题自己练习才能真的学会

树的基本概念

我们还记得线性表一个结点连着一个结点 相对于线性表来说是 一个结点连着多个结点

在这里插入图片描述

1 结点:树中每一个单元就叫一个结点(例如,R,a,b……) 2 结点的度: 拥有子树的数量,换句话说,一个结点连着几个结点,结点的度就是多少(R连着abc R的度就是3,a连着de a的度就是2) 3 树的度: 树内各个结点的度的最大值(该树的度为3,结点的度最大为3) 4 叶子(终端结点): 度为0的结点称为叶子或者终端结点(叶子为:jkefgmni) 5 非叶子(非终端结点): 度不为0的结点。除根结点外,非终端结点也称为内部结点。 6 双亲和孩子(父结点和子结点): 结点的子树的根称为该结点的孩子,该结点称为孩子的双亲双亲也称为父节点,孩子也称为子结点(abc是R的孩子,R是abc的双亲) 7 兄弟: 同一个双亲(父结点)的孩子之间互称兄弟(ghi互称兄弟) 8 祖先: 从根到该结点所经分支上的所有结点(m的祖先为rch) 9 子孙: 以某结点为根的子树中的任一结点都称为该结点的子孙。(a的子孙为de jk) 10 层次: 根结点为第一层,根结点的孩子为第二层依次向下加…… 11 堂兄弟: 双亲在同一层的结点互为堂兄弟。(f的堂兄弟为de ghi) 12 树的深度(高度): 树中结点的最大层次称为树的深度或高度(图示深度为4) 13 有序树和无序树:将数种结点的各子树看成从左到右有次序的(不能互换),则为有序树,否则为无序树 (有序树中最左边的子树的根称为第一个孩子,最右边称为最后一个孩子)

14 森林: m棵互不相交的树的集合,对于每个根结点来说,子树的集合即为森林 在这里插入图片描述

15 度,结点,叶子节点的关系

例题:在一棵度为4的树中,有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,
则树中叶子结点数为?	

设n为结点数量,n0为入度为0的结点数量,n1为入度为1的结点数量,……na为入度为a的结点数量
m为总入度数量(总度的数量)

n = n0 + n1…… + na m = 1 * n1 + 2 * n2 + …… + a * na n = m + 1

三个关系的解释:

每个结点无非就是:    度为0,度为1,……度为a
把这些结点的数量加起来就是总结点数量
 
总入度结点为:			各个度×度的数量
例子:度为3的结点代表他有三个子结点,n3代表度为3的结点的数量,3 * n3 代表度为3的结点一共有多少个子孩子
把每个度都按照这种方式加起来,算出来的称作总度

总度,我们算的是子孩子,这里缺少树中的一个根节点(根结点无法通过父结点的度推出),加上根节点即为总结点的数量

例题解析:

n0为度为0的结点,也称作叶子结点
n = n0 + 10 + 1 + 10 + 20
m = 1 * 10 + 2 * 1 + 3 * 10 + 4 * 20
n = m + 1
带入即可得出结果:82

在链式存储中,n个结点的二叉树有n+1个空指针域

(n个结点一共有2n个指针域,除了根结点,这些指针域都包括剩下的结点,也就是说2n个指针域包含 n-1 个结点,剩下的都为空指针域)

16 满二叉树

​ 满二叉树,顾名思义,二叉树已经满了,最后一层是满的,如果在添加只能是在添加一层

​ 满二叉树看起来像是一个三角形

图1 满二叉树外观上是一个三角形

满二叉树的特性:

满2 叉树节点数

第一层的结点数量为1,

第二层的数量为2

第三层的数量为4

这里可以看作首项为1,公比是2的等比数列

由此可知:

一个层数为K的满二叉树的结点数量:2的K次方 - 1

一个层数为K的满二叉树的叶子结点数量:2的K-1次方

叶结点只能在最后一层

17 完全二叉树

官方解释:
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i1i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

换句话说:和满二叉树一样,但是最后一层可能少几个右边的结点,最后一层如果有结点必须靠左

img

具有n个结点的完全二叉树的深度:[log2k] + 1(注:[ ]表示向下取整)

对一棵完全二叉树有 n 个结点,对任一结点	i(1i≤n)	存在:
	i=1,则 i 为二叉树的根结点,如果 i>1,则父结点为 i/2
	如果 2*i > n ,则 i 结点无左子结点,否则左子结点为 2*i
	如果 2*i+1 > n ,则 i 结点无右子结点,否则右子结点为 2*i+1

完全二叉树叶子结点最下层次下层 ,最下层的叶子结点集中在左边,次下层的叶子结点集中在右边

tips: 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

完全二叉树中  叶子结点,非叶子结点,总结点数的关系:

​	a = 总结点数 / 2b = 总结点数 - aab 中大的是叶子结点,小的是非叶子结点