平衡二叉搜索树(AVL树):
前提是有序的二叉树,它的左右子树的高度差不超过1,而且它的所有子树也满足这个条件
如果一个有序二叉树呈现接近单支状(类似链表),它的查找效率接近链表,因此只有达到平衡时它的查找效率最高
由于节点的值受限,因此只能通过调整达到有序,而不能进行值的修改
二叉树不平衡的基础原因:
x y
/ \ / \
y t1 以y为轴向右旋转 z x
/ \ / \ / \
z t2 t3 t4 t2 t1
/ \
t3 t4
x y
/ \ / \
t1 y 以y为轴向左旋转 x z
/ \ / \ / \
t2 z t1 t2 t3 t4
/ \
t3 t4
x x z
/ \ / \ / \
y t1 z t1 y x
/ \ / \ / \ / \
t2 z y t4 t2 t3 t4 t1
/ \ / \
t3 t4 t2 t3
以z为轴向左旋转 以z为轴向右旋转 最终平衡
x x z
/ \ / \ / \
t1 y t1 z x y
/ \ / \ / \ / \
z t2 t3 y t1 t3 t4 t2
/ \ / \
t3 t4 t4 t2
以z为轴右旋 以z为轴左旋 最终平衡
红黑树:
也是一种自平衡的树,它不是根据子树的高度差来调整平衡的,而是给节点设置一种颜色,来达到平衡
红黑树的特性:
1、每个节点或者是黑色、或者是红色
2、根节点必须是黑色
3、每个叶子节点(NULL)是黑色
4、如何一个节点是红色,则它的子节点必须是黑色
不能有两个连续的红色节点
5、从一个节点到该节点的子孙节点的所有路径上包含了相同数量的黑色节点
保证大致上红黑树是平衡的(最长路径不超过最短路径的两倍)
红黑树插入后的调整:
插入的节点一定是红色
1、如果父节点是黑色,直接插入
2、如果父节点是红色,需要调整
a、叔叔不存在 or 叔叔为黑色
进行 左旋 or 右旋
祖父节点置红 父节点置黑
b、叔叔存在且为红色
祖父置红,父节点和叔叔置黑
把祖父节点当做当前节点,继续向上讨论调整
优点:插入、删除的效率比AVL树高
缺点:没有AVL树平均,查找效率没有AVL树高,但也并不差
哈夫曼树:
基本概念:
路径长度:从一个节点到另一个节点之间的路径条目数
根节点到第n层节点的路径长度为 n-1
树的路径长度:从根节点出发到每个节点的路径长度之和
节点的权:若将树中节点赋予一个有某种意义的数值,该数值称为该节点的权
节点的带权路径长度:从根节点到该节点的路径长度与该节点的权的乘积
树的带权路径长度:所有的叶子节点的带权路径长度之和,称为WPL
WPL是衡量一棵带权二叉树优劣的关键
例子:
成绩: <60 60~69 70~79 80~89 90~100
等级: E D C B A
比例: 5% 15% 40% 30% 10%
普通带权二叉树的WPL:5*1+15*2+40*3+30*4+10*4=315
哈夫曼树的WPL:40+2*30+3*15+4*10+4*5 = 205
哈夫曼树的目的是为了生成一棵WPL最小的的带权二叉树
构建哈夫曼树:
1、把n个带权节点存入一个集合F中,把每个节点左右子树置空
2、从F中选取权值最小的两个节点作为左右子树构建成一棵新的二叉树,且新的根节点的权为左右子树的权值之和
3、从F中删除刚刚选出来的两个节点,把新得到的根节点放入F中
4、重复2、3步骤,直到F中只剩下一棵树,既是哈夫曼树
哈夫曼编码:
目的:解决当年远距离通信(电报)的数据传输的最优解
待发送的文字:BADCA DFEED
方法1:转成二进制发送 A 000 B 001 共30个字符
方法2:
a、根据文字出现频率,构建哈夫曼树
假设频率: A27 B8 C15 D15 E30 F5
b、规定哈夫曼树的左分支为0,右分支为1,则从根节点到叶子节点经过的路径分支所组成的0、1序列为该对应字符的哈弗曼编码
哈夫曼编码:A01 B1001 C101 D00 E11 F1000
1001010010101001000111100 共25个字符
作用:数据压缩、文件压缩的其中一种方式