红黑树(零)

终于 下决心开通自己的博客,虽然自己还是个渣渣。。

第一次写博客,如有错误,还请谅解。。。

前几个月闲来无事开始看算法导论,看到红黑树,发现自己啥都不懂。。

恩。。不懂就去学呗。。

先介绍一下红黑树.....

红黑树,是一种特殊的二叉查找树,说红黑树就必须要说二叉查找树。

二叉树嘛。。是一种可以在O(lgn)的平均时间内完成查找的数据结构,具有以下特点:

1.每个节点至多有两个子节点(若都没有则为叶节点)

2.每个节点至多有一个父节点(若没有则为根节点root)

3.每个节点一定大于其左子节点,小于等于其右节点(这是我的实现,貌似等于左节点也可以?。。)

查找时,从root开始,沿树下降,直到查找到某一节点或没有满足条件的下降路径,表示未找到。

如果树的高度比较平均,那么二叉查找树的性能将会不错,但是如果比较倒霉,插入的时候元素是按顺序插入的。。那么在最坏的情况下,查找的耗时将为O(n),那么该如何解决呢?

一个解决方法是在每个节点上增加一个color域,color域只能有两个值,或红或黑。

红黑树和二叉树有个区别,就是红黑树每个节点都必须要有两个子节点和一个父节点(可以为Null),实际的实现往往用一个NIL节点表示这些所有的Null以节省空间,并且在画图时经常省略NIL节点。NIL节点的Color为Black,其父节点和子节点是多少并不重要。

除此之外,红黑树在二叉查找树的基础上增加了额外的要求:

1.每个节点或为Red或为Black

2.root是Black

3.所有的叶节点(NIL)是Black

4.Red节点的子节点全都是Black(从root到任意一个叶节点的完整路径上不能有两个连续的红色节点)

5.从root到任意一个叶节点的完整路径上,黑节点的总数相等。(定义黑高度为从某一节点(不含本身)到任意一个叶节点(NIL)的路径上黑节点的总数)

红黑树的查找操作和二叉树差不多,插入和删除在二叉树的基础上进行,需要修正由于插入或删除造成的红黑性质的违反。(由此多出两种旋转操作)

可以看出,红黑树从根节点到叶节点的最长路径(黑红黑红。。)至多是最短路径(黑黑。。)的2倍,这一性质让红黑树在最坏情况下都是高效的。

这次先到这里。。具体实现下次再说。。

posted on 2016-10-13 13:55  frokaikan  阅读(110)  评论(0)    收藏  举报