树
树状图是一种数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树;
二叉树
二叉树特点是每个结点最多只能有两棵子树,且有左右之分
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点
红黑树
-
节点是红色或者黑色
-
根节点是黑色
-
每个叶子的节点都是黑色的空节点(NULL)
-
每个红色节点的两个子节点都是黑色的。
-
从任意节点到其每个叶子的所有路径都包含相同的黑色节点。
二叉树引出的缺陷
假设给定一棵树,依次插入9,8,12;
接着我们继续插入:比8小的节点,例如 7,6,5,4,3,会出现如下的树形;
此时查找趋近于线性,【红黑树】就应运而生~
插入的节点均为红色(参照3,4)
插入时采用【变色】和【旋转】来维持平衡度(参照5)
具体的应用场景:在JDK的集合类中TreeSet和TreeMap,以及Java8中都有用到
TreeMap 中的 类成员变量和静态内部类Entry
// 比较器对象
private final Comparator<? super K> comparator;
// 根节点
private transient Entry<K,V> root;
// 集合大小
private transient int size = 0;
// 树结构被修改的次数
private transient int modCount = 0;
// 红黑树节点颜色
private static final boolean RED = false;
private static final boolean BLACK = true;
// 静态内部类用来表示节点类型
static final class Entry<K,V> implements Map.Entry<K,V> {
K key; // 键
V value; // 值
Entry<K,V> left; // 指向左子树的引用(指针)
Entry<K,V> right; // 指向右子树的引用(指针)
Entry<K,V> parent; // 指向父节点的引用(指针)
boolean color = BLACK;
}