avl树与红黑树

AVL树与红黑树

AVL树
	平衡二叉搜索树(Self-balancing binary search tree),又叫AVL树。
	是左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵自平衡二叉树。
	通过左旋和右旋操作来保持平衡。
	左旋右旋操作见下图(来自百度百科),但是有时单纯的左旋右旋并不能平衡,需要先对不平衡子树进行左旋右旋,再整体左旋右旋。

在这里插入图片描述

AVL树的插入、删除、查找

插入

	第一步就是正常的二叉查找树的插入,
	(与结点比较,大就向右,小就向左,直到找到可供插入的空位置)
	第二步就是通过一次或多次的左旋右旋来平衡avl树。

删除

	可以通过把要删除的结点向下旋转成一个叶子结点,接着直接剪除这个叶子结点来完成。

查找

	与二叉查找树的查找一致(与结点比较,大就向右,小就向左,直到找到那个数或者返回空);
红黑树
红黑树(Red Black Tree),也叫R-B树,
红黑树靠左旋、右旋和变色来维持平衡。
左旋和右旋上面介绍了,变色就是改变结点的颜色;
特点:
1.每个结点或者是黑色,或者是红色。
2.根结点是黑色。
3.每个叶子结点(NIL)是黑色。
4.每个红色结点的两个子结点一定都是黑色。
5.任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
红黑树的插入,删除,查找

插入

	依然是两步
	第一步就是正常的二叉查找树的插入。
	第二步通过插入的情况按照性质通过一次或多次的左旋右旋变色来平衡红黑树。一般来说有四
	种情况:
	插入情景1:红黑树为空树
	最简单的一种情景,直接把插入结点作为根结点就行,但注意,根据红黑树性质2:根结点是					
	黑色。还需要把插入结点设为黑色。
	处理:把插入结点作为根结点,并把结点设置为黑色。
	
	插入情景2:插入结点的值已存在
	插入结点的值已存在,既然红黑树总保持平衡,在插入前红黑树已经是平衡的,
	那么把插入结点设置为将要替代	
	结点的颜色,再把结点的值更新就完成插入。
	
	插入情景3:插入结点的父结点为黑结点
	由于插入的结点是红色的,当插入结点的黑色时,并不会影响红黑树的平衡,
	直接插入即可,无需做自平衡。
	
	插入情景4:插入结点的父结点为红结点
	1. 如果插入的结点叔叔结点(插入结点的父结点的兄弟结点)为红结点,
	那么 就要把父结点和叔叔结点涂成黑结点,祖父结点涂成红结点(但如果是根结点不涂)。
	
	2、如果插入的结点父结点是祖父结点的右支,叔叔结点为黑结点,且
	(1)要插入的结点为父结点的右支,那么对其 祖父结点左旋。就相当于:
	 (2)要插入的结点为父结点的左支,那么 对父结点先右旋,然后按照旋转后的位置重新进行规则判断,
	 接着对其祖父结点进行左旋。
	 
	 3、如果插入的结点,父结点为,父结点是祖父结点的左支,叔叔结点为黑结点,且
	 (1)要插入的结点为父结点的左支,那么对其 祖父结点右旋。
	 (2)要插入的结点为父结点的右支,那么 对父结点先左旋,然后按照旋转后的位置重新进行规则判断,
	 接着对其祖父结点进行右旋。

删除

	若删除的结点是红色,则不做任何操作,红黑树的任何属性都不会被破坏;若删除的结点是黑色的,显然它所在的
	路径上就少一个黑色结点,红黑树的性质就被破坏了,这时执行一个 Delete-Fixup()来修补这棵树。 一个结
	点被删除之后,一定 有一个它的结点代替了它的位置,即使是叶结点被删除后,也会有一个空结点来代替它的位置。
	 设指针 x 指向这个代替位置的结 点,同时引入指向 x 兄弟的指针 w,这里均假设 x 是 x->parent 的左子结
	 点,则 w 是 x->parent 的右子结点,如果实际遇到相反的情 况,只要把所有操作中的左、右 互反一就可以了。

查找

与二叉查找树的查找一致(与结点比较,大就向右,小就向左,直到找到那个数或者返回空);	

红黑树与AVL树的比较:

AVL是严格的平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多;
红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低开销;
选择:
红黑树的插入效率更高,而AVL查找效率高,如果搜索的次数远远大于插入和删除,那么选择AVL树,如果搜索,插入删除次数几乎差不多,应选择红黑树。
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值