红黑树的旋转变色

public void colorChange(Node<T> n) {
            setcolor(n, 2);

            // 如果当前节点父亲是红色且叔节点也是红色
            while (n != null && n != root && colorof(parent(n)) == 2) {
                // n的父亲是爷爷的左儿子
                Node<T> parentleft = leftof(parent(parent(n)));
                if (parent(n) == parentleft) {
                    // 当前节点的叔节点为爷爷的右儿子 颜色为红色
                    Node<T> y = rightof(parent(parent(n)));
                    if (y != null && colorof(y) == 2) {
                        // 将父节点设置为黑色
                        setcolor(parent(n), 1);
                        // 将叔节点设置为黑色
                        setcolor(y, 1);
                        
                        // 将爷节点设置为红色
                        setcolor(parent(parent(n)), 2);
                        // 将n设置为爷节点
                        n = parent(parent(n));

                    } else {
                        //叔节点为黑色
                        // 当前节点是其父亲的右子节点
                        if (n == rightof(parent(n))) {
                            // 当前节点等于其父节点
                            n = parent(n);
                            //左旋转
                            leftRotate(n);
                        }
                        //爸爸在左 儿子也在左
                        // 将当前节点的父节点设置为黑色
                        Node pnode = parent(n);
                        setcolor(pnode, 1);
                        // 爷节点设置为红色
                        setcolor(parent(parent(n)), 2);
                        // 以爷节点为基准 右旋转
                        rightRotate(parent(parent(n)));

                    }

                    // n的父亲是爷爷的右儿子
                } else {
                    // 叔节点
                    Node uncle = rightof(parent(parent(n)));
                    // 叔节点为红色
                    if (colorof(uncle) == 2) {
                        // 将父节点设置为黑色
                        setcolor(parent(n), 1);
                        // 将叔节点设置为黑色
                        setcolor(uncle, 1);
                        // 将爷节点设置为红色
                        setcolor(parent(parent(n)), 2);
                        // 将当前节点设置为当前节点的爷节点
                        n = parent(parent(n));

                    } else {
                        // 当前节点是父节点的左节点
                        if (n == leftof(parent(n))) {
                            n = parent(n);
                            // 以当前节点的父节点为基准 右旋转
                            rightRotate(n);
                            //以爷爷为轴右旋转
//                            leftRotate(parent(parent(n)));
//                            leftRotate(n);
                        }
                        // 将当前节点的父节点设置为黑色
                        setcolor(parent(n), 1);
                        // 爷节点设置为红色
                        setcolor(parent(parent(n)), 2);

                        // 以爷节点为基准 右旋转
                        leftRotate(parent(parent(n)));
                    }

                }
            }
            setcolor(root, 1);
        }

 

posted @ 2020-09-25 21:25  蓝冰nine  阅读(642)  评论(0)    收藏  举报