高级数据结构与算法 红黑树及线段树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 • 另外,如果p(v)与u都是红色的,那么性质 4也会遭到破坏。但实际上我们解决性质 5遭 到破坏的方案在不用作任何额外工作的情况 下就可以同时解决性质 4 遭到破坏的问题, 所以从现在开始我们将集中精力考虑性质 5 的问题。
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 • 我们用u来表示二叉搜索树删除操作后在树 中取代了v的位臵的那个结点。如果u是叶结 点,那么我们可以确定它是黑色的。 • 如果v是红色的,那么删除操作就完成了。 因为这种删除不会破坏红黑树的任何性质。 • 所以,我们下面假定 v 是黑色的。删除了 v 之后,这会破坏红黑树的性质5。
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树解题一般方法 1、分析题目,了解题目的区间性。 2、根据题目要求将一个区间建成线段树, 一般的题目都需要对坐标离散。建树时, 不要拘泥于线段树这个名字而只将线段建 树,只要是表示区间,而且区间是由单位 元素(可以是一个点、线段、或数组中一个 值)组成的,都可以建线段树;不要拘泥于 一维,根据题目要求可以建立面积树、体 积树等等。
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 • 我们要区分四种不同的情况: • A. 如果u结点是红色的或者它是树的根结 点(或两者皆是),只要将它染为黑色就可 以完成删除操作。在余下的情况里,我们可 以假设这个带记号的结点u是黑色的,并且 不是根结点。
8 红黑树及线段树
• 红黑树删除 B. 如果这个双黑色结点的兄弟结点以及两个 侄子结点都是黑色的,那么我们就将它的兄 弟结点染为红色之后将这个记号朝树根的方 向移动一步。
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 • 将那个兄弟结点染为红色,就会从所有到 该结点的子孙叶结点的路径上去掉一个黑色 结点,因此现在这些路径上的黑色结点数量 与到双黑色结点的子孙叶结点的路径上的黑 色结点数量一致了。我们将这个记号向上移 动到 y,这表明现在所有到 y的子孙叶结点的 路径上缺少一个黑色结点。此时问题仍然没 有得到解决,但我们又向树根推进了一步。
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的性质
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的维护
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的维护
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的应用
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 D. 最终,我们遇到了双黑色结点有一个黑色 兄弟结点并至少一个侄子结点是红色的情况。 这种情况下我们生成了一个额外的黑色结点, 记号被丢掉,删除操作完成。 • 将上面的所有情况综合起来,我们可以看 出在最坏的情况下我们必须沿着从叶结点到 根结点的路径每次都执行常量次数的操作, 因此删除操作的时间复杂度为O(log n)。
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
• 红黑树插入
8 红黑树及线段树
8 红黑树及线段树
• 红黑树插入1—插入点z
8 红黑树及线段树
• 红黑树插入2—插入点z
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
• 红黑树插入3—插入点z
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
□ 线段树解题一般方法 3、树的每个节点根据题目所需,设臵变量 记录要求的值。 4、用树形结构来维护这些变量:如果是求 总数,则是左右儿子总数之和加上本节点 的总数,如果要求最值,则是左右儿子的 最值再联系本区间。利用每次插入、删除 时,都只对O(logL) 个节点修改这个特点 ,在O(logL) 的时间内维护修改后相关节 点的变量。
wk.baidu.com
8 红黑树及线段树
• 红黑树(RB树)
8 红黑树及线段树
8 红黑树及线段树
• 红黑树插入-Okasaki方法
8 红黑树及线段树
在旋转操作中<AxByC>的顺序保持不变。
8 红黑树及线段树
• 红黑树插入-Okasaki方法(旋转)
8 红黑树及线段树
• 红黑树插入-CLRS方法
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
□ 线段树解题一般方法 5、在非规则删除操作,和大规模修改数据 操作中,要灵活的运用子树的收缩与叶子 节点的释放,避免重复操作。
8 红黑树及线段树
8 红黑树及线段树
本课结束
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
• CLRS方法与Okasaki方法比较 • 第二点不同是在这种情况下 CLRS 方法必须 满足一个先决条件,即下端红色结点的叔叔 结点必须是黑色的。如果那个叔叔结点是红 色的,那么最终的树中将存在两个相邻的红 色结点,因此这种方法不能适用于叔叔结点 为红色的情况。
8 红黑树及线段树
• 红黑树插入 • 考虑下端红色结点的叔叔结点为红色的情 况。在这种情况下我们将上端红色结点和它 的兄弟结点染为黑色并且将它们的父结点染 为红色。树的结构并没有进行调整。 • 这时根据下端红色结点是其父结点的左子 结点还是右子结点以及上端红色结点是其父 结点的左子结点还是右子结点可以分出四种 情况,但是这四种情况从本质上来说都是相 同的。
• 红黑树插入4—插入点z
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 标准二叉搜索树的删除操作的三种情况: 1. 要删除的结点没有子结点。在这种情况下, 我们直接将它删除就可以了。如果这个结点 是根结点,那么这颗树将成为空树;否则, 将它的父结点中相应的子结点指针赋值为 NULL
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 2. 要删除的结点有一个子结点。与上面一 样,直接将它删除。如果它是根结点,那么 它的子结点变为根结点;否则,将它的父结 点中相应的子结点指针赋值为被删除结点的 子结点的指针
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 3. 要删除的结点有两个子结点。在这种情 况下,我们先找到这个结点的后继结点 ( successor ),也就是它的右子树中最小 的那个结点。然后我们将这两个结点中的数 据元素互换,之后删除这个后继结点。由于 这个后继结点不可能有左子结点,因此删除 该后继结点的操作必然会落入上面两种情况 之一。
8 红黑树及线段树
高级算法与数据结构
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
• 红黑树(RB树) 一棵红黑树本身是一棵二叉排序树。且满 足下列性质: (1)每一个结点必须是红或黑两者之一; (2)所有叶子结点是黑色的; (3)每一个结点是红色的,则它的孩子结点 必须是黑色的; (4)每一个结点到所有叶子结点路径所经过 的黑色结点数目相同。
8 红黑树及线段树
8 红黑树及线段树
• CLRS方法与Okasaki方法比较 • 它们有两点不同。第一点是关于如何对最 终的子树进行染色的。在 Okasaki 方法中, 这颗子树的根结点 y 被染成红色而它的子结 点被染成黑色,然而在 CLRS 方法中 y 被染成 了黑色而它的子结点被染成了红色。 • 将y染成黑色意味着对树的调整不需要向根 结点的方向继续进行下去 。在此情况下, CLRS 插入方法最多需要进行两次旋转操作即 可完成插入。
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 • 但出于重建红黑树性质的目的,我们只关 心最终被删除的那个结点。我们称这个结点 为v,并称它的父结点为p(v)。 • v的子结点中至少有一个为叶结点。如果 v有一个非叶子结点,那么v在这颗树中的位 臵将被这个子结点取代;否则,它的位臵将 被一个叶结点取代。
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 • 很显然,只有带记号的结点的两个侄子结 点都是黑色时才能进行上述操作,这是因为 如果有一个侄子结点是红色的那么该操作会 导致出现两个相邻的红色结点。 • C. 如果带记号的结点的兄弟结点是红色的, 那么我们就进行一次旋转操作并改变结点颜 色。
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
□ 线段树 • 线段树定义 一棵二叉树,记为T(a,b),参数a,b 表 示该节点表示区间[a,b]。区间的长度b-a 记为L。递归定义T[a,b]:若L>1 : [a,(a+b) div 2]为T的左儿子 [(a+b) div 2,b]为T 的右儿子。 若L=1 :T 为一个叶子节点。
8 红黑树及线段树
8 红黑树及线段树
□ 线段树 • 表示区间[1, 10] 的线段树
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的引入
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的引入
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的引入
8 红黑树及线段树
8 红黑树及线段树
□ 线段树的引入
8 红黑树及线段树
• 红黑树删除
8 红黑树及线段树
8 红黑树及线段树
8 红黑树及线段树
• 红黑树删除 • 由于这个记号比起操作前离树的根结点更 远了,所以看起来似乎我们向后倒退了。但 请注意现在这个双黑色结点的父结点是红色 的了,所以如果下一步操作属于情况 B ,那 么这个记号将会向上移动到那个红色结点, 然后我们只要将它染为黑色就完成了。