【问题标题】:Why we need fix color when a black node of Red Black Tree has two children both red?当红黑树的一个黑色节点有两个都是红色的孩子时,为什么我们需要修复颜色?
【发布时间】:2024-06-12 18:10:02
【问题描述】:

我正在学习如何在 Java 中实现红黑树,我查阅了来自 Sanfoundry 的源代码:https://www.sanfoundry.com/java-program-implement-red-black-tree/ 但我无法理解插入节点的功能 代码在这里:

public void insert(int item) {

        current = parent = grand = header;

        nullNode.element = item;

        while (current.element != item) {

            great = grand;

            grand = parent;

            parent = current;

            current = item < current.element ? current.left : current.right;

            // Check if two red children and fix if so            
            if (current.left.color == RED && current.right.color == RED) {
                handleReorient(item);
            }

        }

        // Insertion fails if already present
        if (current != nullNode) {
            return;
        }

        current = new RedBlackNode(item, nullNode, nullNode);

        // Attach to parent
        if (item < parent.element) {
            parent.left = current;
        } else {
            parent.right = current;
        }

        handleReorient(item);

    }

    private void handleReorient(int item) {

        // Do the color flip
        current.color = RED;

        current.left.color = BLACK;

        current.right.color = BLACK;

        if (parent.color == RED) {

            // Have to rotate
            grand.color = RED;

            if (item < grand.element != item < parent.element) {
                parent = rotate(item, grand);  // Start dbl rotate
            }
            current = rotate(item, great);

            current.color = BLACK;

        }

        // Make root black
        header.right.color = BLACK;

    }

    private RedBlackNode rotate(int item, RedBlackNode parent) {

        if (item < parent.element) {
            return parent.left = item < parent.left.element ? rotateWithLeftChild(parent.left) : rotateWithRightChild(parent.left);
        } else {
            return parent.right = item < parent.right.element ? rotateWithLeftChild(parent.right) : rotateWithRightChild(parent.right);
        }

    }

    /* Rotate binary tree node with left child */
    private RedBlackNode rotateWithLeftChild(RedBlackNode k2) {

        RedBlackNode k1 = k2.left;

        k2.left = k1.right;

        k1.right = k2;

        return k1;

    }

    /* Rotate binary tree node with right child */
    private RedBlackNode rotateWithRightChild(RedBlackNode k1) {

        RedBlackNode k2 = k1.right;

        k1.right = k2.left;

        k2.left = k1;

        return k2;

    }

谁能给我解释一下为什么当一个黑色节点同时有两个红色子节点和handleReorient函数的含义时我们需要修复颜色,tks all!

【问题讨论】:

    标签: java data-structures red-black-tree-insertion


    【解决方案1】:

    一般来说

    1. 找到要插入的节点的叶子位置
    2. 您插入节点并将其着色为红色
    3. 如果这个节点有一个父节点并且它是红色的,那么这就是违反红黑规则的,你会沿着根节点的方向遍历树,修复这些违规行为直到树被纠正。

    但是我已经看到了插入代码,特别是 Sedgewick 的左倾红黑树,其中红黑树“准备”在向下插入的过程中。 看这里 Left-Leaning Red-Black Trees 再看第 20 页和第 21 页。你会发现对于 2-3-4 树,具有 4 个元素的节点在向下的过程中被分割。红黑树中的 4 节点等效于具有 2 个红色子节点的黑色节点。

    handleReorient() 等价于进行拆分的代码(相当于重新着色)。

    【讨论】:

      最近更新 更多