二叉查找树,平衡二叉树,红黑树

三 数据结构

工具:https://www.cs.usfca.edu/~galles/visualization/BST.html

有了二叉查找树、平衡树为啥还需要红黑树?

红黑树算是很难的一种数据结构吧。所以,更多是会考察你对红黑树的理解程度,考察的最多的估计就是为什么有了二查找查找树/平衡树还需要红黑树这个问题了。

3.1 二叉查找树的缺点

二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大。如图所示:

https://img2018.cnblogs.com/blog/1757082/201908/1757082-20190829165948638-1112267772.png

 基于二叉查找树的这种特点,我们在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点。n 个节点的二叉查找树,正常的情况下,查找的时间复杂度为 O(logn)。之所以说是正常情况下,是因为二叉查找树有可能出现一种极端的情况,例如:

https://img2018.cnblogs.com/blog/1757082/201908/1757082-20190829170108561-349694926.png

 这种情况也是满足二叉查找树的条件,然而,此时的二叉查找树已经近似退化为一条链表,这样的二叉查找树的查找时间复杂度顿时变成了O(n),可想而知,我们必须不能让这种情况发生,为了解决这个问题,于是我们引申出了平衡二叉树。

3.2 平衡二叉树

平衡二叉树就是为了解决二叉查找树退化成一颗链表而诞生了,平衡树具有如下特点:

1、具有二叉查找树的全部特性。

2、每个节点的左子树和右子树的高度差至多等于1。

例如:图一就是一颗平衡树了,而图二则不是(节点右边标的是这个节点的高度)

 https://img2018.cnblogs.com/blog/1757082/201908/1757082-20190829170314240-1825165169.png

 https://img2018.cnblogs.com/blog/1757082/201908/1757082-20190829170347371-227873163.png

    对于图二,因为节点9的左孩子高度为2,而右孩子高度为0。他们之间的差值超过1了。平衡树基于这种特点就可以保证不会出现大量节点偏向于一边的情况了。于是,通过平衡树,我们解决了二叉查找树的缺点。对于有 n 个节点的平衡树,最坏的查找时间复杂度也为 O(logn)

客观上评价一个算法性能的好坏一般就是用时间复杂度:

        常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。常见的算法时间复杂度由小到大依次为: 

                               c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n!

3.3 为什么有了平衡树还需要红黑树?

虽然平衡树解决了二叉查找树退化为近似链表的缺点,能够把查找时间控制在 O(logn),不过却不是最佳的,因为平衡树要求每个节点的左子树和右子树的高度差至多等于1,这个要求实在是太严了,导致每次进行插入/删除节点的时候,几乎都会破坏平衡树的第二个规则,进而我们都需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。

显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树,

红黑树的性质:

1、节点不是红色就是黑色。

2、没有连接在一起的红色节点;

3、根节点是黑色,叶子节点也是黑色。

4、红色节点的两个子节点都是黑色。

红黑树的变换

1 变色

2 左,右旋  

变换的时机

变色:当前节点的父节点是红色,并且祖父节点的另一个节点(叔叔节点)也是红色

  1. 父节点变成黑色.
  2. 叔叔节点变成黑色。
  3. 祖父节点变成红色 
  4. 旋转
  •         左旋: 父节点是红色,叔叔节点是黑色,且当前节点是右子树的时候,左旋
  •         右旋: 父节点是红色,叔叔节点是黑色,当前节点是左子树的时候,右旋(treeMap有源码)

例如下面的图片(注意,图片中黑色的、空的叶子节点没有画出)(图片来自极客时间)

    正是由于红黑树的这种特点,使得它能够在最坏情况下,也能在 O(logn) 的时间复杂度查找到某个节点。不过,与平衡树不同的是,红黑树在插入、删除等操作,不会像平衡树那样,频繁着破坏红黑树的规则,所以不需要频繁调整,这也是我们为什么大多数情况下使用红黑树的原因。

    不过,单单在查找方面的效率的话,平衡树比红黑树快。所以,我们也可以说,红黑树是一种不大严格的平衡树。也可以说是一个折中方案。而关于红黑树的应用,一个非常经典的就是在JDK1.8HashMap,TreeMap,TreeSet当链表长度超过8时,就会由链表变成红黑树

     由于红黑树只是一个特殊的排序二叉树,因此对红黑树上的只读操作与普通排序二叉树上的只读操作完全相同,只是红黑树保持了大致平衡,因此检索性能比排序二叉树要好很多。

     但在红黑树上进行插入操作和删除操作会导致树不再符合红黑树的特征,因此插入操作和删除操作都需要进行一定的维护,以保证插入节点、删除节点后的树依然是红黑树。

小结:

平衡树是为了解决二叉查找树退化为链表的情况,而红黑树是为了解决平衡树在插入、删除等操作需要频繁调整的情况。

https://blog.csdn.net/worn_xiao/article/details/106066492 JAVA并发下的容器

https://blog.csdn.net/worn_xiao/article/details/105901112 HashMap,HashTable,TreeMap,HashSet,TreeSet

https://blog.csdn.net/worn_xiao/article/details/105900828 List&LinkList,Queue&Deque

注意:最好先看一下(三)中 树红黑树的数据结构分析,可以的话数组,链表的数据结构也先复习一下,这里默认你懂数组,链表

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值