数据结构 -树

1 知识框架

在这里插入图片描述
基本概念:
1.度:一个结点的孩子为该结点的度,树中最大度数为树的度。
2.深度,高度,层次:高度和层次都是从顶至下,高度是从底至上。

基本性质:
1.结点数 = 所有度数之和 + 1
2.具有n个结点的m叉数的最小高度
在这里插入图片描述
3.非空二叉树上的叶结点等于度为2的结点树+1

2 二叉树概论

2.1 特殊二叉树

1.满二叉树
高度为h,有2^h - 1个结点。
在这里插入图片描述

2.完全二叉树
叶结点的高度差不超过1且最下面结点从左往右,左边一个不缺。
在这里插入图片描述

3.二叉排序树
左 < 根 < 右 或者 右 < 根 < 左
树上的任何一颗子树都遵守
在这里插入图片描述

4.平衡二叉树
树上任何一个左右子树深度之差不超过1 (后面文章细讲平衡二叉树的插入与删除)

2.2 二叉树的存储

1.顺序存储
完全二叉树适合顺序存储,一般二叉树在存储时,空白结点也分配存储空间使他与完全二叉树一致
0表示不存在的空白结点
0表示不存在的空白结点
使用顺序存储时,数组下标从1开始,使他能符合完全二叉树的性质,如下:
在这里插入图片描述

2.链式存储
定义:

typedef struct tree{
	ElemType data;
	struct tree *lchild,*rchild;
	int ltag,rtag;
}tree,*Tree;

树的建立和二叉树各种函数的应用(各种遍历,线索化)在前面的文章 二叉树函数总结
简单二叉树创立

2.3 线索二叉树

定义:
若无左子树,lchild 指向前驱,ltag = 1;无右子树,rchild 指向后继,rtag = 1;

typedef struct ThreadTree
{
	int data;
	struct ThreadTree * lchid,rchild;
	int ltag,rtag;
}ThreadTree,*ThreadTree

1.中序线索化
在这里插入图片描述

void midTreadTree(tree *p)//线索化方法 
{
	if(p != NULL){
		midTreadTree(p -> lchild);//遍历左孩子 
		if(p -> lchild == NULL){
			p -> ltag = 1;//为空,令标志=1; 
			p ->lchild = pre;//pre永远是指向上一个节点的指针 
		}
		else {
			p -> ltag = 0;//不为空令标志= 0; 
		}
		if(pre -> rchild == NULL){
			pre -> rtag = 1;
			pre -> rchild = p;
		}
		else {
			pre -> rtag = 0;
		}
		pre = p;
		midTreadTree(p->rchild);//p指向当前节点,此时pre==p,p向后移动一位 
	}
}

为了方便,还可以增加一个头结点:
在这里插入图片描述

2.先序线索化,后序线索化:递归的位置交换一下。

3 树,二叉树,森林

3.1 相互转换

1.树转换成二叉树:左孩子,右兄弟。
在这里插入图片描述

2.森林 -> 二叉树 -> 树:每颗二叉树的右子树一定为空!

在这里插入图片描述
把树转换成二叉树,将紫色的线断开即可。

3.2 树,森林,二叉树遍历

在这里插入图片描述

4 哈夫曼树

1.定义
带权路径长度(WPL)最小的二叉树称为哈夫曼树
在这里插入图片描述

(a)WPL = (7 +5 + 2 + 4) * 2 = 36
(b)WPL = 4 * 2 + (7 + 5) * 3 + 2 * 1 = 46
(c)WPL = 7 * 1 + 5 * 2 + (2 + 4) * 3 = 35
// 其中c最小,它恰好就是哈夫曼树

2.构造
理论:从各结点中选取两个数值最低的构成新的结点,直到只剩一个结点

在这里插入图片描述

3.哈夫曼编码
前缀编码:没有一个编码是另一个编码的前缀。例如:0 01 101 100
在这里插入图片描述
(数字代表字符出现的次数)
哈夫曼编码:左 0 右 1(不是固定,约定俗成)
WPL = 224;也就是此时的编码长度为224位
如果采用3位固定长度编码,L = 3 * (45 + 13 + 12 + 5 + 9 + 16) = 300
由此可得到 哈夫曼编码压缩了24%的数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值