0
点赞
收藏
分享

微信扫一扫

大话数据结构阅读笔记——树

崭新的韭菜 2022-02-14 阅读 56
数据结构

6.1开场白

6.2树的定义

之前的栈、队列等都是一对一的线性结构;而现实中存在很多一对多的非线性结构,这就需要讨论树,总结规律性质,用于解决问题;
定义强调两点:1,n=0时,成为空树;2,当n>0时,子树的个数没有限制,但是子树之间不能相交;
一、节点分类
根节点,叶节点,度(节点的子节点数量);
二、节点关系
孩子节点,双亲,兄弟
三、节点层次
最大层次称之为树的深度;

6.3树的抽象数据类型

给出一些树的操作

6.4树的存储结构

之前的顺序存储结构、链式存储结构都不能直接反应树的关系;
这里需要充分利用顺序结构和链式结构:

1,双亲表示法;2,孩子表示法;3,孩子兄弟表示法;

一、双亲表示法
假设使用一段连续的空间存储树,增加字段存储双亲的下标来表示树之间的关系;(这样能够直接找到双亲节点,但是要找孩子节点需要遍历整个树),并且根节点没有双亲设置为-1
如果关系孩子,可以正价一个字段存储孩子的下标,如果孩子不存在设置-1
如果关心兄弟,可以郑加一个字段存储兄弟节点的下标;
这说明数据结构的设计不是越多越好,而是根据需要去设置
二、孩子表示法
1.树的n个节点,使用节点的度作为数据长度,如果有孩子,指向孩子;
2.树的n个节点,使用一个单独的字段维护节点的度,剩余的位置指向孩子;
第一种方法缺点在于如过树的度差别很大,过于浪费空间
第二种则是需要维护度的字段,浪费时间;
孩子表示法:使用一个顺序表存储节点,第二个字段存储该节点孩子链表的头结点;孩子链表中存储的是节点的下标;
可以改进为孩子双亲表示法等等;方便查找节点的双亲;
三、孩子兄弟表示法
左孩子、右兄弟如果存在就是唯一的,利用这个进行表示;
树的n个节点,如果有左孩子,则指向孩子,如果有右一个兄弟,指向兄弟
这样能够将一棵树转化为二叉树;

6.5二叉树的定义

二叉树的一个应用就是二分搜索法;
二叉树:每个节点都只有左子树与右子树(它的度不超过2)

6.6二叉树的特点

1只有一个根
2左子树与右子树是不同的
3即使只有一个子节点,也要区分左右
二、特殊二叉树
满树
斜树
完全二叉树:满树一定是完全二叉树,完全不一定满(从中总结出完全二叉树的性质
三、二叉树的性质
1,二叉树第i层最多有2^(i-1)个节点
2,深度为k的二叉树最多有2^k -1个节点
3,对于二叉树,有n0 = n2 +1
4,有n个节点的完全二叉树,深度为【log2n】+1(不大于log2n的最大整数+1
5,对于完全二叉树,对节点编号;
1)i=1,节点无双亲,根节点
2)2i>n,节点无左孩子;否者其左孩子是2i
3)2i+1>n,节点无右孩子;否者右孩子是2i+1

6.7二叉树存储结构

一、顺序存储结构,
完全二叉树适合;
但是如果是斜树,会造成空间浪费
二、二叉链表
设置1个数据域存放节点数据,设置2个指针域指向两个孩子;
同理,如果关系双亲,可以增加一指针域指向双亲

6.8二叉树遍历

一、遍历原理:重点在于 次序和访问
二、遍历方法(就是把树中的结构,转换成计算机能够处理的线性序列
1,前序遍历 先根节点
2,中序遍历 中间根节点
3,后序遍历 最后根节点
4,层序遍历
三、四、五、使用递归实现遍历

def get(T):
	if T==None:
		return
	print(T.data)
	get(T.lchild)
	get(T.rchild)

六、二叉树遍历推导
1,知道前序遍历和中序遍历,能够确定唯一树
2,知道后序遍历和中序遍历,能够确定唯一树

6.9二叉树的建立

将二叉树拓展成为拓展二叉树,使用#号代替不存在的节点,对拓展二叉树前序遍历;
之后通过前序遍历的方式将data填上就可以

def create(T):
	ch = input()
	if ch=='#':
		T=None
	else:
		if(!T):
			return
		T.data = ch
		create(T.lchild)
		create(T.rchild)

6.10线索二叉树

通过前序遍历,能够知道一个节点的便利顺序,在一个节点前一个叫前驱,在后一个叫后继;
在二叉树存储时空间利用不高,n节点共有n+1的空指针域;
将右空指针域存储该节点的后继
将左空指针域存储该节点的前驱
这样可以的到线索二叉树:能够方便的获取前驱后继也就是前序遍历,而不需要每一次都遍历一次;
并且要增加两个标志;ltag、rtag:设置0,1用于表示是否是data还是线索

遍历线索二叉树相当于一个双向链表的遍历;

如果需要获取前驱与后继,使用线索二叉树

6.11树森林转换二叉树

一,树转二叉树
1,加线 兄弟节点连线
2,去线 树中节点,只保留第一个孩子的连线
3,层次调整 第一个孩子的线为左节点,兄弟节点是右节点
二,森林转二叉树

6.12霍夫曼树与其应用

从树1节点到另一个节点的分支构成两个节点之间的路径,路径上的分支数目叫做路径长度;树的路径长度就是从根节点到每一个节点的路径长度之和
带权路径长度WPL最小的二叉树叫做霍夫曼树;
目的是为了解决电报传输问题,如果直接传输电报,1个字母用3个二进制表示,会比较大;使用霍夫曼树,将使用频率高的字母转化成霍夫曼编码,可以节省发送的数据量;

举报

相关推荐

0 条评论