首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红黑树左转

红黑树左转
EN

Stack Overflow用户
提问于 2013-10-31 09:25:07
回答 1查看 1.6K关注 0票数 0

我一直在浏览罗伯特·塞奇威克的算法中描述的红黑树。这是插入到红色黑树中的代码。

代码语言:javascript
复制
public void put(Key key, Value val) {
    root = put(root, key, val);
    root.color = BLACK;
    assert check();
}

// insert the key-value pair in the subtree rooted at h
private Node put(Node h, Key key, Value val) { 
    if (h == null) return new Node(key, val, RED, 1);

    int cmp = key.compareTo(h.key);
    if      (cmp < 0) h.left  = put(h.left,  key, val); 
    else if (cmp > 0) h.right = put(h.right, key, val); 
    else              h.val   = val;

    // fix-up any right-leaning links
    if (isRed(h.right) && !isRed(h.left))      h = rotateLeft(h);
    if (isRed(h.left)  &&  isRed(h.left.left)) h = rotateRight(h);
    if (isRed(h.left)  &&  isRed(h.right))     flipColors(h);
    h.N = size(h.left) + size(h.right) + 1;

    return h;
} 

这是一个形象形象的红色黑色修复。

考虑一下这种情况,当要插入的项位于前3节点的中间时.我们必须按照三个in语句中所给出的方式执行三个操作,即h=rotateLeft(h)h=rotateRight(h)flipcolors(h)。问题是当我们分配h = rotateLeft(h)时。返回的节点是指向具有两个连续左红色链接的三个节点中的中间节点的指针。但是,该算法假设返回的节点是3个节点中的顶部节点,其中有2个连续的左红色链接。所以,当我们再次使用rotateRight(h)时,我们最终得到的位置与我们开始的位置相同。可能是我还不懂算法。

以下是rotateLeft(h)的代码

代码语言:javascript
复制
private Node rotateLeft(Node h) {
    assert (h != null) && isRed(h.right);
    Node x = h.right;
    h.right = x.left;
    x.left = h;
    x.color = x.left.color;
    x.left.color = RED;
    x.N = h.N;
    h.N = size(h.left) + size(h.right) + 1;
    return x;
}

请帮助我理解h=rotateLeft(h)如何给出顶部节点,而不是中间节点的三个节点连续两个红色左链接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-31 09:52:58

我终于明白了算法的工作原理。在h=rotateLeft(h)之后,第二和第三if statements评估为false。并返回h。在递归的一个层次上,我们得到了h.left =h,其中等式左边的h是三个节点中的顶层节点,具有两个连续的红色左链接。然后,第一个if语句计算为false,第二个if语句计算为true,然后进行右旋转,然后进行翻转颜色。

如果我错了,请纠正我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19702613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档