平衡查找树

一棵2-3查找树或为一棵空树,或由一下结点组成:
2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。
3-结点,含有两个键(及其对应的值)和三条链接,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的两个键之间,右链接指向的2-3树中的键都大于该结点。
因为平衡二叉树在插入和删除过程中需要判断插入的结点时2-结点还是3-结点等等一系列问题,实现起来代码量特别大,并且会增加额外开销,所以就提出了红黑树。
红黑树(平均插入效率和查询效率都是log(N))
红黑树的基本思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树。
由上图可以很明显的看到红黑树可以完全代替2-3树,下面给出红黑树的定义:
1. 红连接均为左链接。
2. 没有任何一个结点同时和两条红链接相连
3. 该树是完美黑色平衡的,即任意空链接到根节点的路径上的黑链接的数量相同
1 | private class Node<T> { |
然后再给出两个操作:左旋转和右旋转以及颜色转换。
这三个操作都是局部改变,并不会对整个红黑树造成破坏
左旋转

因为右链接不能为红色,旋转后
1 | public <T> Node<T> rotateLeft(Node<T> h) { |
右旋转
1 | public <T> Node<T> rotateRight(Node<T> h) { |
颜色转换


1 | public <T> void flipColors(Node<T> h) { |
这三个操作是用来构建一个红黑树的,当插入一个元素到红黑树中时,需要沿着插入点到根节点的路径上向上移动,对于经过的每个结点,有如下操作:
如果右子节点是红色的而左子节点也是红色的,进行右旋转。
如果左子节点是红色的且它的左子节点也是红色的,进行右旋转
如果左右子节点均为红色,进行颜色转换。
HashMap源码中的红黑树实现
1 | static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> { |
https://www.cnblogs.com/skywang12345/p/3245399.html#a34
https://www.cnblogs.com/edwinchen/p/4797055.html