红黑树

1、在理解红黑树之前,先看一下二叉查找树

       二叉查找树特性:左子树上所有节点的值都小于或等于其他根节点上的值,右子树上所有节点的值均大于或等于他的根节点的值。左右字数也分别为平衡二叉树。

举个例子:

如果要查询10的话,10>9

 

因此到他的右子树,右子树根节点为13,10<13

 

因此到其左子树,左子树根节点11>10

 到其左子树,为10,找到相应的节点。

 不过二叉查找树有一些问题,可能会出现不平衡的情况,即如下图所示的情况:

 

 从这种情况可以看出,明显存在左子树和右子树深度相差过多,在使用平衡情况下的二叉查找树时时间复杂度是logn,而出现这种极端情况的话,想要查9的位置就需要遍历下一个右子树,很有可能时间复杂度变为n.

        基于上述情况,引入了平衡二叉树,红黑树即为平衡二叉树的一种。

二、红黑树

        特性:节点是红色或黑色。根节点一定是黑色,每个叶节点都是黑色的空节点(NIL节点)。每个红节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不能有两个连续的红节点)(即对于层来说除了NIL节点,红黑节点是交替的,第一层是黑节点那么其下一层一定是红节点,反之一样)。

        从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。正是由于这些原因使得红黑树是一个平衡二叉树。

红黑树的例子:

向红黑树插入节点14(一般默认插入节点是红色的) 

在原树上插入20

 

 可以看到,插入以后树已经不是一个平衡二叉树了,而且并不满足红黑树的要求,因为20和21均为红色,这种情况下就需要对红黑树进行变色,21需要变为黑色,22就会变成红色,如果22变成红色,则需要17和25都变成黑色。

而17变成黑色显然是不成立的,因为如果17变为黑色,那么13就会变成红色,不满足二叉树的规则,因此此处需要进行另一个操作——左旋操作。

        左旋:下图就是一个左旋的例子,一般情况下,如果左子树深度过深,那么便需要进行左旋操作以保证左右子树深度差变小。

        对于上图由于右子树中17变为黑色以后需要把13变为红色,因此进行一次左旋,将17放在根节点,这样即可保证13为红色,左旋后结果为: 

而后根据红黑树的要求进行颜色的修改

       进行左旋后,发现从根节点17,到1左子树的叶子节点经过了两个黑节点,而到6的左叶子节点或者右叶子节点要经历3个黑节点,很显然也不满足红黑树,因此还需要进行下一步操作,需要进行右旋操作。

        右旋,与左旋正好相反:

由于是从13节点出现的不平衡,因此对13节点进行右旋,得到结果

而后再对其节点进行变色,得到结果:

 

 这便是红黑树的一个变换,它主要用途有很多,例如Java中的TreeMap以及JDK1.8以后的HashMap在当个节点中链表长度大于8时都会用到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
因权限不够,只能上传20M,故分两部分上传 提供了有关使用算法和数据结构的一个详尽的介绍。Bucknall先从算法性能的讨论开始,涵盖了诸如数组、链表和二叉树等内容。这本书强调了查找算法(如顺序和二分查找),另外也重点介绍了排序算法(包括冒泡排序、插入排序、希尔排序、快速排序和堆排序),此外还提供了有关的优化技术。不仅如此,作者还介绍了散列和散列表、优先队列、状态机和正则表达式以及诸如哈夫曼和LZ77等数据压缩技术。 随附光盘中有作者所开发的一个相当成功的自由软件库EZDSL,另外还有可运行于各版本Delphi上和Kylix上的源代码,此外还提供了TurboPower Software公司的可执行程序。 目录 前言 致谢 第1章什么是算法 1.1什么是算法 1.2算法和平台 1.3调试与测试 1.4小结 第2章数组 2.1数组 2.2Delphi中的数组类型 2.3TList类和指针数组 2.4磁盘数组 2.5小结 第3章链表、栈和队列 3.1单链表 3.2双向链表 3.3链表的优缺点 3.4栈 3.5队列 3.6小结 .第4章查找 4.1比较例程 4.2顺序查找 4.3二分查找 4.4小结 第5章排序 5.1排序算法 5.2排序基础知识 5.3小结 第6章随机算法 6.1随机数生成 6.2其他随机数分布 6.3跳表 6.4小结 第7章散列和散列表 7.1散列函数 7.2利用线性探测方法实现冲突解决 7.3其他开放定址机制 7.4利用链式方法解决冲突 7.5利用桶式方法解决冲突 7.6磁盘上的散列表 7.7小结 第8章二叉树 8.1创建一个二叉树 8.2叉树的插入和删除 8.3二叉树的遍历 8.4二叉树的类实现 8.5二叉查找树 8.6伸展树 8.7红黑树 8.8小结 第9章 优先队列和堆排序 9.1优先队列 9.2堆 9.3堆排序 9.4扩展优先队列 9.5小结 第10章 状态机和正则表达式 10.1状态机 10.2正则表达式 10.3小结 第11章数据压缩 11.1数据表示 11.2数据压缩 11.3位流 11.4最小冗余压缩 11.5字典压缩 11.6小结 第12章 高级主题 12.1读者-写者算法 12.2生产者-消费者算法 12.3查找两文件的差别 12.4小结 后记

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值