教你透彻了解红黑树---第一篇

文章《教你透彻了解红黑树—第一篇》,主要了解了红黑树的前因后果和基础属性。node

文章《教你透彻了解红黑树—第二篇》,主要说明了红黑树的旋转、插入、删除等操做。web

1 背景知识

1.1 二叉树

二叉树是每一个节点最多有两个子树的树结构。一般子树被称做“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。app

以上参考Wikipedia-binary tree中的介绍svg

1.2 常见二叉树

  • 彻底二叉树:若二叉树的高度是h,除第h层以外,其余(1~h-1)层的节点数都达到了最大个数,而且第h层的节点都连续的集中在最左边。实际上,彻底二叉树和堆联系比较紧密哈,同时彻底二叉树不必定是满二叉树,反之必定是。this

  • 满二叉树:除最后一层外,每一层上的全部节点都有两个子节点,最后一层都是叶子节点。编码

  • 哈夫曼树:又称为最有数,这是一种带权路径长度最短的树。哈夫曼编码就是哈夫曼树的应用。.net

  • 平衡二叉树:平衡二叉树又称AVL树(Adelson-Velskii and Landis Tree),左右两个子树的高度差的绝对值不超过 1,其子树也遵循该规则。翻译

  • 红黑树:红黑树是每一个节点都带颜色的树,节点颜色或是红色或是黑色,红黑树是一种查找树。红黑树有一个重要的性质,从根节点到叶子节点的最长的路径很少于最短的路径的长度的两倍。对于红黑树,插入,删除,查找的复杂度都是O(log N)。指针

AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,二人在 1962 年的论文 “An algorithm for the organization of information” 中发表了它orm

1.3 二叉树详细介绍

有关二叉树的详细说明,请进入这篇文章查看《教你透彻了解二叉树》

2 红黑树简介

2.1 红黑树

先来看看Wikipedia 中有关Red–black tree的介绍:

A red–black tree is a kind of self-balancing binary search tree. Each node of the binary tree has an extra bit, and that bit is often interpreted as the color (red or black) of the node. These color bits are used to ensure the tree remains approximately balanced during insertions and deletions.

简单翻译以下:

红黑树,一种自平衡的二叉查找树,但在每一个结点上有一个额外的存储位表示结点的颜色,能够是Red或Black。这些颜色位用来确保红黑树在插入和删除操做后仍可以近乎平衡。

既然红黑树做为一棵二叉查找树(Binary Search Tree, 又称二叉排序树,一个意思),知足二叉查找树的通常性质。下面,来了解下二叉查找树的通常性质。

二叉查找树或者是一棵空树,或者是具备下列性质的二叉树:

  1. 若左子树不空,则左子树上全部结点的值均小于它的根结点的值;
  2. 若右子树不空,则右子树上全部结点的值均大于它的根结点的值;
  3. 左、右子树也分别为二叉排序树;
  4. 没有键值相等的节点。

二叉查找树是一棵动态树,树的结构是变化的,是依据插入或删除后的结构来构成的。

一棵由n个节点组成的二叉查找树,其高度至少为log2(n+1),其通常操做的时间复杂度O(log2(n+1)),这个时间复杂度能够理解成其遍历一次所访问的节点数。可是,若是这棵树退化为一棵链状的树,其时间复杂度就转变为O(n)。

红黑树时间复杂度显然不会为最糟糕的O(n),其操做时间复杂度最糟糕是O(log2(n+1)),这是由于它在二叉查找树的基础上增长了着色和相关的性质使得红黑树相对平衡。

维基百科(Wikipedia)中介绍为如下属性:

  1. A node is either red or black.
  2. The root is black. This rule is sometimes omitted. Since the root can always be changed from red to black, but not necessarily vice versa, this rule has little effect on analysis.
  3. All leaves (NIL) are black.
  4. If a node is red, then both its children are black.
  5. Every path from a given node to any of its descendant NIL nodes contains the same number of black nodes. The uniform number of black nodes in the paths from root to leaves is called the black-height of the red–black tree.

简单翻译就是:

  1. 每一个结点要么是红的要么是黑的。
  2. 根结点是黑的。
  3. 每一个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
  4. 若是一个结点是红的,那么它的两个儿子都是黑的。
  5. 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。

下图便是一棵红黑树,图片来源于Wikipedia-binary tree
An example of a red–black tree

》》》注意上图中的叶节点并无画出来,而是以NIL指针代替,这是由于叶节点在这里并不包含数据,只是做为结束符。

总结:上述内容旨在熟悉红黑树的基本属性,有关其旋转/插入/删除/查找等操做将会在《教你透彻了解红黑树—第二篇目》中详细说明。