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

文章《教你透彻了解红黑树—第一篇》,主要了解了红黑树的来龙去脉和基础属性。

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

1 背景知识

1.1 二叉树

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

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

1.2 常见二叉树

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

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

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

  • 平衡二叉树:平衡二叉树又称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” 中发表了它

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指针代替,这是因为叶节点在这里并不包含数据,只是作为结束符。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
红黑树的c实现源码与剖析 原作者:那谁 源码剖析作者:July ===================== July说明: 由于原来的程序没有任何一行注释,我把它深入剖析,并一行一行的添加了注释, 详情请参见此文: 你彻底实现红黑树红黑树的c源码实现与剖析 http://blog.csdn.net/v_JULY_v/archive/2011/01/03/6114226.aspx 关于红黑树系列的程,还可看下以下倆篇文章: 透彻了解红黑树: http://blog.csdn.net/v_JULY_v/archive/2010/12/29/6105630.aspx 红黑树算法的层层剖析与逐步实现 http://blog.csdn.net/v_JULY_v/archive/2010/12/31/6109153.aspx Ok,君自看。 -------------------------------------------------------------------------------------------------- //以下是最初的源程序。 //如果你看不太懂,那么就证明了我所做的源码剖析工作有意义了。:D。 //详情,参见My Blog[谷歌或百度搜"结构之法"] //http://blog.csdn.net/v_JULY_v ------------------------------------------------------------------------------------------------- #include #include #include ............. .............. //:D。这下,你应该发现我所添加的注释的价值了。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/v_JULY_v/archive/2011/01/03/6114226.aspx 一切的详情请参见此文: 你彻底实现红黑树红黑树的c源码实现与剖析 http://blog.csdn.net/v_JULY_v/archive/2011/01/03/6114226.aspx 关于红黑树系列的程,还可看下以下倆篇文章: 透彻了解红黑树: http://blog.csdn.net/v_JULY_v/archive/2010/12/29/6105630.aspx 红黑树算法的层层剖析与逐步实现 http://blog.csdn.net/v_JULY_v/archive/2010/12/31/6109153.aspx 我博客还有有关微软等公司数据结构+算法面试100题的资料, 详情,参见My Blog: http://blog.csdn.net/v_JULY_v ----- July、二零一一年一月三日。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值