平衡二叉树:任意节点的左右子树高度相差不能大于1
红黑树的目的是为了解决动态插入、删除后二叉查找树性能退化的问题
1.红黑树的特性
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
2.红黑树的基本操作
1.左旋 右旋
左旋是将某个节点旋转为其右孩子的左孩子,再将原来该节点右孩子的左孩子变为该节点的右孩子
而右旋是节点旋转为其左孩子的右孩子,再将原来该节点左孩子的右孩子变为该节点的左孩子
2.红黑树和平衡二叉树的区别(红黑树的优势)
红黑树是一个二叉查找树,不像平衡二叉树要求所有节点左右子树高度差不超过1,红黑树只要求从一个节点到所有叶结点的路径中,最长路径不超过最短路径的两倍,所以红黑树只追求树的大致平衡。
因为对树平衡程度的不同要求,平衡二叉树在插入和删除的过程中会花费比较大的代价来维护树的平衡,所以平衡二叉树不适合插入、删除太多的场景。而红黑树只要求弱平衡,它做到了当插入和删除时,只需最多旋转3次就能实现一定程度的平衡,所以能将查询、插入和删除的时间复杂度维持在对数级别(O(logn))。
3.谈谈对红黑树的了解
1.红黑树的特性
2.红黑树的调整方式主要是左旋右旋,当插入一个节点时,应该是红色,此时所有路径上黑色节点数目不变,
(1)当插入为根节点时,变为黑色
(2)父节点是黑色是,无影响
(3)如果父节点和叔叔节点都是红色,会把父节点和叔叔节点的颜色变成黑色,然后把祖先节点的颜色变成红色,此时可能祖先节点与其父节点形成连续红色节点,需要向上进行递归。
(4)如果父节点为红色,叔叔节点为黑色,则需要根据左旋右旋来
4.红黑树的数据结构定义
enum Color
{
RED = 0,
BLACK = 1
};
struct RBTreeNode
{
struct RBTreeNode*left, *right, *parent;
int key;
int data;
Color color;
};
5.红黑树的各种操作时间复杂度
能保证在最坏情况下,基本的动态几何操作的时间均为O(lgn)
6.二叉查找树的特性
1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树。
7.红黑树的应用
JDK的集合类TreeMap和TreeSet底层就是红黑树实现的,在Java8中,连HashMap也用到了红黑树