设为首页 - 加入收藏
广告 1000x90
您的当前位置:主页 > 资源代码 > 技术文章 > 正文

从节点到叶子节点的路径包含相同数目的黑色节点伟仔玲姐恋

来源: 伯乐在线 编辑:小编 时间:2019-05-27 14:02
从节点到叶子节点的路径包含相同数目的黑色节点伟仔玲姐恋

            brother=parent.right

红黑树基础知识 定义

红黑树是带有 color 属性的二叉搜索树,color 的值为红色或黑色,因此叫做红黑树。

23

        walk_node.left.parent=walk_node

            node=root

            walk_node.right.parent=walk_node

如果真的要问我红黑树有什么用?为什么要学它?我真的回答不上,但是我觉得,基础的东西,多学一些也无妨。只有学了,有个思路在脑海里,以后才能用得上,不然等真正要用才来学的话,似乎会浪费了很多学习成本。

    whileIS_RED(node)

    elseif(node.key<walk.key)

        ifbrother.left.color==BLACK andbrother.right.color==BLACK

注意:该假设只是加在 new_successor 的结点上,而不是该结点的颜色属性。

5

18

     structRBNode *right;

15

6

        T.root=node

红黑树的性质

每个节点不是红色就是黑色;

        elsewalk=walk.right

        ifIS_RED(brother)

对于 a,从上面可知,查找的算法复杂度是 O(lgn)。

22

        elseifbrother.right.color=BLACK

红黑树的插入操作分析

红黑树的插入操作,先找到要新节点插入的位置,将节点赋予红色,然后插入新节点。最后做红黑树性质的修复。

7

6

    ifnode=parent.left

                uncle.color=BLACK

如果 uncle 是红色,那么直接将 uncle 变为黑色,同时 parent 也变黑。但是这样一来,以 grandparent 为根所在的子树的黑高就 +1,因此将 grandparent 变红使其黑高减一,然后将 node 指向 grandparent,让修复结点上升两个 level,直到遇到根结点为止。

证明如下:

        grandparent=parent->parent

而前者,违反了性质 4 的,即红黑树出现了连续两个红结点的情况。修复的变化还要看父结点是祖父结点的左孩子还是右孩子,左右两种情况是对称的,此处看父结点是祖父结点的左孩子的情况。要恢复红黑树的性质,那么就需要将 parent 的其中一个变黑,这样的话,该结点所在的子树的黑高 +1,这样就会破坏了性质 5,违背了初衷。因此需要将 parent->parent(grandparent)的另一个结点(uncle 结点)的黑高也 +1 来维持红黑树的性质。

RB-DELETE(T,node)

删除过程中需要保存 successor 的颜色 color,因为删除操作可能会导致红黑树的性质被破坏,而删除操作删除的是 successor。因此,每一次改变 successor 的时候,都要更新 color。

                node=grandparent

8

            brother.right.color=BLACK

每个叶子节点是黑色;

对每个节点来说,从节点到叶子节点的路径包含相同数目的黑色节点。

    color=node.color

17

1

12

        walk_node.color=node.color

22

插入的算法复杂度分析

插入的步骤主要有两步

=>  h<=2log(n+1)

        prev=walk

        walk_node.left=node.left

    while(walk!=NULL)

17

旋转的算法复杂度:从图示可知,旋转的操作只是做了修改指针的操作,因此算法复杂度是 O(1)。

        color=walk_node.color

可得 n + 1 >= 2^h/2。两边取对数得:

设根结点的 parent 指针指向 NULL,新结点的左右孩子 left 和 right 指向 NULL。叶子结点是 NULL。

25

设 h 是树高,根据性质 4 可知道,每一条路径至少有一半的节点是黑的,因此 bh(x) - 1 = h/2。

1

注:笔者参考的是算法导论的伪代码,但是在实现的时候,因为用 NULL 表示空结点,如果需要修复的结点 need_fixup_node为空时无法拿到其父结点,因此保存了其父结点 need_fixup_node_parent 及其所在方向 direction,为删除修复时访问其父结点及其方向时做调整。

4

9

7

        brother=parent.right

        transplant(T,node,walk_node)

如果直接将额外黑上移给父结点,那么以 new_successor 的父结点为根的子树就会失去平衡,因为左子树的黑高 -1 了。因此需要根据 new_successor 的兄弟结点 brother 的颜色来考虑调整。

如果 successor 不是 node 的右孩子,而因为 node 的后继是没有左孩子的(这个可以查看相关证明),所以删除掉 node 的后继 successor 之后,需要将 successor 的右孩子 successor.right 补上 successor 的位置。

13

红黑树的删除操作分析

红黑树的删除操作,先找到要删除的结点,然后找到要删除结点的后继,用其后继替换要删除的结点的位置,最后再做红黑树性质的修复。

21

2

node.color=BLACK

19


    本文网址:http://www.shlzwl.cn/a/ziyuan/jishuwenzhang/9276.html ,喜欢请注明来源。

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
从节点到叶子节点的路径包含相同数目的黑色节点伟仔玲姐恋

站长沙龙 www.shlzwl.cn 中国百万站长的福音,一站式服务。网站地图

Copyright © 2002-2019 站长沙龙 客服qq:

Top