树/二叉树/红黑树/堆/哈夫曼树/B 树

定义:
树:n≥0个节点构成的有限集合。
当n=0,称为空树
当n>0,树中有一个称为“根”的特殊节点,其余节点可分为m个互不相交的有限集合,其中每个集合本身又是一颗树,称为原来树的子树。
树/二叉树/红黑树/堆/哈夫曼树/B 树_第1张图片

大致了解的树:
树/二叉树/红黑树/堆/哈夫曼树/B 树_第2张图片

二叉树:
树/二叉树/红黑树/堆/哈夫曼树/B 树_第3张图片

树/二叉树/红黑树/堆/哈夫曼树/B 树_第4张图片

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。
二叉查找树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;

AVL树(平横查找树):每个节点的左子树和右子树的高度最多差1的二叉查找树(空树的高度定位-1)

红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能
红黑树也是二叉查找树,它们当中每一个节点的比较值都必须大于或等于在它的左子树中的所有节点,并且小于或等于在它的右子树中的所有节点

一般的,红黑树,满足一下性质,即只有满足以下性质的树,我们才称之为红黑树:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点,即空结点(NIL)是黑的。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

算法第四版中给出红黑树
1) 红链接均为左链接
2) 没有任何一个节点同时和两条红链接相连
3) 该树是完美黑色平衡,任意空链接到根节点上的路径上的黑色链接数量相同

红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了存储为来表示节点的颜色。

树/二叉树/红黑树/堆/哈夫曼树/B 树_第5张图片

**哈夫曼树:**给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。

如何构造哈夫曼数呢:
把权值最小的两棵二叉树数合并:
如权值分别为 1,2,3,4,5
第一次将1和2合并得(合并后的权值为1+2=3):
树/二叉树/红黑树/堆/哈夫曼树/B 树_第6张图片
因为有第一部所以最小的两棵二叉树的权值为3,3得(权值为6的一棵二叉树)
树/二叉树/红黑树/堆/哈夫曼树/B 树_第7张图片
现在权值最小的两棵二叉树是4和5故的
树/二叉树/红黑树/堆/哈夫曼树/B 树_第8张图片
最后两个权值分别为9和6的二叉树合并
树/二叉树/红黑树/堆/哈夫曼树/B 树_第9张图片

树/二叉树/红黑树/堆/哈夫曼树/B 树_第10张图片

AVL树:
AVL树的插入策略:
从根节点开始插入,如果比节点大,插入右边子树,如果比节点小插入左边子树。依次遍历的比较,进行插入,如果树是空的,将其赋给树的根节点,如果在向左插入,或向右插入的时候,子树是空的,那么就直接挂在节点的左边或右边(看向那边插入)

插入的时候,如何旋转?
因为插入的时候是遍历版的比较,每一次比较都会有返回,进行查看比较的节点左边子树高度和右边子树高度之差。如果高度之差为2,那么改节点失衡。

如果插入的节点在失衡节点的左子树:
		插入节点比失衡节点的左子节点小,那么进行LL单旋转
		插入节点比失衡节点的左子节点大,那么进行LR双旋转

如果插入的节点在失衡节点的右子树:
	插入节点比失衡节点的右子节点大,那么进行RR单旋转
	插入节点比失衡节点的右子节点小,那么进行RL双旋转

LL单旋转:
树/二叉树/红黑树/堆/哈夫曼树/B 树_第11张图片

树/二叉树/红黑树/堆/哈夫曼树/B 树_第12张图片

树/二叉树/红黑树/堆/哈夫曼树/B 树_第13张图片

RR单旋转:
树/二叉树/红黑树/堆/哈夫曼树/B 树_第14张图片

树/二叉树/红黑树/堆/哈夫曼树/B 树_第15张图片

树/二叉树/红黑树/堆/哈夫曼树/B 树_第16张图片

双旋转可以转换为两次单旋转:
LR旋转:失衡节点的左子节点先当作失衡节点进行一次RR旋转,在以失衡节点进行一次LL旋转
RL旋转:失衡节点的右子节点当作失衡节点进行一次LL旋转,在以失衡节点进行RR旋转。

红黑树:
参考:http://blog.csdn.net/v_JULY_v/article/details/6105630这里就不再多说

你可能感兴趣的:(数据结构/算法)