红黑树的理解

红黑树是平衡二叉树,所以任意节点的左边子节点总是小于等于父节点,右边的子节点总是大于等于父节点。

红黑树增加对节点颜色的抽象定义,注意:只是定义,用这个定义的属性,在以后的插入和删除数据的时候,按着定义的颜色属性根据红黑树规则进行旋转调整。

红黑树规则:

1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

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

其中规则4和5是理解红黑树极为重要的两条规则和保持性能的规则。

规则4使得红色节点不能连续,规则五又使得红色节点必须出现;那么一旦将一个初始的平衡二叉树的节点颜色确定好之后,在以后的插入和删除数据的过程中,要保持红黑树的规则进行调整。调整有变色和旋转两种方式。

由于规则5,那么最大的抵达节点的深度不会是最短的抵达节点的深度的2倍(除非一个节点深度是黑->黑,一个是黑->红->黑)。

理解了规则5,就理解了保持红黑树规则的调整本质上就是平衡二叉树的子树枝的左移和右移。细想,平衡二叉树在增加数据的时候,很容易造成不平衡,因为随意的找到父节点比较大小,那么就确定在左边还是右边,那么很容易造成放置在一边,很容易出现单个树枝深度很长。

红黑树的规则本质上就是限制单支或者某些树枝深度过深,与其他树枝深度不平衡,因为规则5在限制(抵达任何叶子,路过黑色节点数相同);所以保证了平衡二叉树该有的性能。

在java中 1.6,1.7TreeSet,TreeMap 都是使用红黑树,1.8中的hashMap 当链表长度达到8以后就会转换成红黑树。jdk1.6和1.7中HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。

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