首先了解下树的概念,这是了解红黑树的基础,红黑树是java中treeMap和hashMap的底层,因此先学习树的基本知识为后面的源码解读做准备。
度为2的树称为二叉树,是我们的研究对象
这是一颗满二叉树
下面是一颗完全二叉树
前面都是为了做铺垫的概念,真正和程序相关联的首先是 BST 二叉搜索树(又称为二叉排序树),BST要求任何一个非叶子节点,左子节点的权比父节点的权小,右子节点的权比父节点权大
BST 的深度优先遍历 ----- 这里只举例深度优先遍历
二叉搜索树的深度遍历分为:先序遍历、中序遍历、后序遍历
先序遍历: 根节点、左子树、右子树
中序遍历: 左子树、根节点、右子树 --中序遍历的结果是有序的
后序遍历: 左子树、右子树、根节点
上图先序遍历输出结果: 10 8 6 9 12 11 13 上图中序遍历输出结果: 6 8 9 10 11 12 13 上图后序遍历输出结果: 6 9 8 10 11 13 12
在某些极端特殊情况下,二叉搜索树会产生问题,由于左小右大的特点, 例如 1,2,3,4,5,6创建一颗二叉搜索树时更像是一个单链表。 那么查询效率就会显著降低,因此衍生了平衡二叉树。
平衡二叉树
- 平衡二叉树也叫平衡二叉搜索树,它满足二叉搜索树的所有特征。
- 任意一个节点的平衡因子的绝对值不能大于1
某节点的高度值= Math.max(左子树高,右子树高)+1 平衡二叉树有一个平衡因子的概念: 某个节点的左子树和右子树高度值的差称为平衡因子
向上图中添加一个新的节点 3,使得平衡二叉树不再平衡,此时需要维护平衡
找到新增节点的所在路径 从叶子节点递归计算平衡因子,找到不平衡的节点,不平衡节点在左边则右旋在右边则左旋,
当树的深度较深时,不平衡节点在树的左子树的右边则先左旋再右旋,反之则先右旋再左旋。
红黑树的定义
- 红黑树的叶子节点指的是最后的空节点,想象下 叶子节点的孩子节点
- 红黑树的每个节点都有颜色表示,要么红色要么黑色
- 根节点一定是黑色的
- 每个叶子节点一定是黑色的
- 如果一个节点是红色的那么他的孩子节点一定是黑色的
- 任意节点到叶子节点所经过的黑色节点是一样的
2-3树的定义
- 每个节点可以存放一个或两个元素
- 存放一个元素的节点称为2-节点,存放两个元素的节点称为3-节点
- 每个节点都有2个或3个子节点的树称为2-3树,2-3树满足BST的基本特征
- 2-3树是一个绝对平衡的树
2-3树添加节点的前提是需要维护绝对平衡:
满足二叉搜索树的特征
维持绝对平衡
不能往null节点插入数据
2-3树和红黑树的等价性
红黑树添加元素保持根是黑色的