红黑树:
也是一种自平衡的树,它不是根据子树的高度差来调整平衡的,而是给节点设置一种颜色来达到平衡
红黑色的特性:
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+30*2+15*3+10*4+5*4=205
哈夫曼树的目的是为了生成一棵WPL最小的带权二叉树
构建哈夫曼树:
1、把n个带权节点存入一个集合F中,把每个节点左右子树置空
2、从F中选取权值最小的两个节点作为左右子树构建成一棵新的二叉树,且新的根节点的权为左右子树的权值之和
3、从F中删除刚刚选出来的两个节点,把新得到的根节点放入F中
4、重复2、3步骤,直到F中只剩下一棵树,即是哈夫曼树