数据结构--红黑树

来源:互联网 发布:mac os x系统官网下载 编辑:程序博客网 时间:2024/06/07 07:22

概述

红黑树是二叉树是一颗自平衡的排序二叉树通过颜色的约束来维持着二叉树的平衡

这里写图片描述

规则

1、每个节点都只能是红色或者黑色2、根节点是黑色3、每个叶节点(NIL节点,空节点)是黑色的。4、任一条路径上不能出现相邻的两个红色结点。5、从任一节点到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(如:从根节点13到每个叶子节点(NIL)的所有路径上都只有3个黑色节点)

这里写图片描述

特性

于红黑二叉树而言它主要包括三大基本操作:左旋、右旋、着色。

增加节点

对于新节点的插入有如下三个关键地方:1、插入新节点总是红色节点 。2、如果插入节点的父节点是黑色, 能维持性质 。3、如果插入节点的父节点是红色, 破坏了性质. 故插入算法就是通过重新着色或旋转, 来维持性质 。

为根节点

若新插入的节点N没有父节点,则直接当做根据节点插入即可,同时将颜色设置为黑色

父节点为黑色

这种情况新节点N同样是直接插入,同时颜色为红色,由于根据规则四它会存在两个黑色的叶子节点,值为null。同时由于新增节点N为红色,所以通过它的子节点的路径依然会保存着相同的黑色节点数(否则违反5)

父节点P和P的兄弟节点U都为红色

这里写图片描述

对于这种情况若直接插入肯定会出现不平衡现象。怎么处理?P、U节点变黑、G节点变红。这时由于经过节点P、U的路径都必须经过G所以在这些路径上面的黑节点数目还是相同的。但是经过上面的处理,可能G节点的父节点也是红色,这个时候我们需要将G节点当做新增节点递归处理。

若父节点P为红色,叔父节点U为黑色或者缺少,且新增节点N为P节点的右孩子

左旋.并交换NP节点的颜色

这里写图片描述

父节点P为红色,叔父节点U为黑色或者缺少,新增节点N为父节点P左孩子

右旋,减缓NP颜色

这里写图片描述

汇总图

这里写图片描述

删除

被删除的D节点为红色

这里写图片描述

因为D为红色,所以P必为黑色,同时DR不可能为红色(否则违反性质4)。同时由于性质5,则DR必为Nil,否则就D树来说,经过DR与不经过DR的路径的黑节点数必不相同。现在要删除D节点,只需要直接将D节点删除,并将DR作为P的左子节点即可。

这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这棵树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。所以红黑树它是复杂而高效的,其检索效率O(log n)。

参考

http://cmsblogs.com/?p=1013

简化的添加
https://www.cnblogs.com/xuqiang/archive/2011/05/16/2047001.html
完整的添加
http://blog.csdn.net/dreamclr/article/details/50962566
简单的删除
https://www.cnblogs.com/tongy0/p/5460623.html

原创粉丝点击