红黑树(零)
终于 下决心开通自己的博客,虽然自己还是个渣渣。。
第一次写博客,如有错误,还请谅解。。。
前几个月闲来无事开始看算法导论,看到红黑树,发现自己啥都不懂。。
恩。。不懂就去学呗。。
先介绍一下红黑树.....
红黑树,是一种特殊的二叉查找树,说红黑树就必须要说二叉查找树。
二叉树嘛。。是一种可以在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倍,这一性质让红黑树在最坏情况下都是高效的。
这次先到这里。。具体实现下次再说。。
浙公网安备 33010602011771号