java心得(hashmap之红黑树)

因为在JDK1.8后在hashmap基础上增加了红黑树,所以百度学习了解下红黑树

1.为什么要增加红黑树?

因为之前hashmap底层结构是数组加链表,但是当数据大到一定程度的时候,即使是用链表存储也是比较长,难以增删改查,所以在默认链表长度为8的时候链表转换为二叉树查找的方式。

2.用二叉树查找的缺点?(查找效率)


根据以上图示,如果是右边那种情况和链表查找效率其实是一样,所以做好情况和最坏查找情况两极分化太大,就像你参加比赛有时候拿100分,有时候拿2分,所以需要寻找一种比较稳定的二叉树来代替,然后选择了AVL树

3.用AVL树的缺点(查找稳定性)

首先我们必须知道二叉查找树查找的本质?主要是根据叶子节点在哪一层来判断查找难易,是叶子节点决定的

然后必须明白怎么去改变二叉查找树稳定性?因为二叉查找数每个节点两边的数目没有限制,所以导致整个二叉树某个节点的叶子节点相差太大,也就是查找难度相差太大,所以我们可以让二叉查找数彼此的层数比较均衡,这样叶子节点比较均衡,然后查找就比较稳定

然后百度下什么叫AVL数?1.本身首先是一棵二叉搜索树。  2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。

正是因为限制高度差,所以难度比较平稳,可是带来的问题是当插入一个节点时候需要满足的要求就会增加,也就需要左旋转和右旋转,所以增加节点时候复杂度增加,然后旋转红黑树

4.红黑树(减少增删改的复杂度)

首先百度下什么叫红黑树

性质1. 节点是红色或黑色。  

性质2. 根节点是黑色。 

性质3 每个叶节点(NIL节点,空节点)是黑色的。  

性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)  

性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

然后需要源码需要记住的两点是

1. 增加进去的节点一定是红节点,如果父类是黑色那就不用改变

2. 如果父类是黑色就需要按照一定规则改变。

为什么加进去的节点是红节点?因为加进去红节点完全没有破坏红黑树5个性质,重点如果父节点是黑色的话就可以直接插入而不需要像AVL数那么麻烦旋转

为什么需要用红黑两种颜色?我们首先需要了解红黑树的本质,AVL数的本质是节点左右树之差不能超过1,而红黑树的本质放宽,节点左右树之差不能超过两倍,也就是左树层数为1,右树最多为2,左树为2,右树最多为4.然后性质五和设置为红黑两色是为了满足红黑树的本质,假如左右树都为5个相同的黑色,然后红色是插孔相间,那左边最大树只能为9,而右边为5,也就是左右树永远相差小于2倍

如果父节点为红色怎么办?因为加进去的一定是红色,如果父节点是红色就违背性质4,所以百度下网上有三种规则旋转,我也是刨根绝地学习到这里

    原文作者:算法小白
    原文地址: https://blog.csdn.net/weixin_40174677/article/details/78766780
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞