美文网首页
红黑树之左右旋转

红黑树之左右旋转

作者: YAOPRINCESS | 来源:发表于2020-08-29 22:45 被阅读0次

/**
 * @author klr
 * @create 2020-08-29-21:58
 */
public class RedBlackTree {
    //定义红黑色
    private static final boolean RED = false;
    private static final boolean BLACK = true;

    //定义根节点
    private RBNode root;

    public RBNode getRoot() {
        return root;
    }

    /**
     * 围绕p点左旋
     *              pf                  pf
     *            /                   /
     *          p                   pr(r)
     *        /  \                 /  \
     *      pl    pr(r)           p     rr
     *          /   \           /  \
     *         rl   rr         pl   rl
     *
     * @param p
     */
    public void leftRotate(RBNode p) {
        if (p != null) {
            RBNode r = p.right;//先记录r的信息

            p.right = r.left;//r.left为不为null无所谓
            if (r.left != null) {
                r.left.parent = p;//rl的父节点指向p了
            }

            r.parent = p.parent;
            if (p.parent == null) {
                //此时表明p为根节点,旋转后,r称为根节点}
                root = r;
            } else if (p.parent.left == p) {
                //说明p为pf的左节点
                p.parent.left = r;//把pf指向r
            } else {
                p.parent.right = r;
            }
            r.left = p;
            p.parent = r;
        }
    }

    /**
     * 右旋为左旋的镜像
     * @param p
     */
    public void rightRotate(RBNode p) {
        if (p != null) {
            RBNode l = p.left;//先记录r的信息

            p.left = l.right;//r.left为不为null无所谓
            if (l.right != null) {
                l.right.parent = p;//rl的父节点指向p了
            }

            l.parent = p.parent;
            if (p.parent == null) {
                //此时表明p为根节点,旋转后,r称为根节点}
                root = l;
            } else if (p.parent.right == p) {
                //说明p为pf的左节点
                p.parent.right = l;//把pf指向r
            } else {
                p.parent.left = l;
            }
            l.right = p;
            p.parent = l;
        }
    }
    

    static class RBNode<K extends Comparable<K>, V>{
        private RBNode parent;
        private RBNode left;
        private RBNode right;
        private boolean color;
        private K key;
        private V value;

        public RBNode() {
        }

        public RBNode(RBNode parent, RBNode left, RBNode right, boolean color, K key, V value) {
            this.parent = parent;
            this.left = left;
            this.right = right;
            this.color = color;
            this.key = key;
            this.value = value;
        }

        public RBNode getParent() {
            return parent;
        }

        public void setParent(RBNode parent) {
            this.parent = parent;
        }

        public RBNode getLeft() {
            return left;
        }

        public void setLeft(RBNode left) {
            this.left = left;
        }

        public RBNode getRight() {
            return right;
        }

        public void setRight(RBNode right) {
            this.right = right;
        }

        public boolean isColor() {
            return color;
        }

        public void setColor(boolean color) {
            this.color = color;
        }

        public K getKey() {
            return key;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public V getValue() {
            return value;
        }

        public void setValue(V value) {
            this.value = value;
        }
    }

}

相关文章

  • 红黑树之左右旋转

  • Collection

    图解集合 8 : 红黑树的移除节点操作 图解集合7:红黑树概念、红黑树的插入及旋转操作详细解读 图解集合 6 : ...

  • 数据结构

    红黑树 什么时候需要旋转 颜色翻转?

  • 树结构合集二

    AA树 红黑树的编程相当复杂,AA树是一颗带有条件的红黑树,相当情况下简化了红黑树的编程. AA树规定只有右孩子才...

  • 红黑树的旋转

    转换规则 红黑树默认插入的是红子树、也不允许有任何两个相连的节点都为红色。 1、颜色转换情况:如果当前节点的父节点...

  • 从二叉树到红黑树

    一说到红黑树,有人就特别恐惧,立马想到的是红黑树的性质啊,插入方式啊,复杂的旋转啊。网上一搜索红黑树,也是这些...

  • 红黑树(RBT)

    红黑树的性质 旋转 插入 删除 #1. 红黑树的性质 红黑树是一棵二叉搜索树,它在每个结点上增加一个存储位来表示结...

  • 红黑树

    本文的主要内容:1、红黑树的基本概念以及最重要的5点规则。2、红黑树的左旋转、右旋转、重新着色的原理与Java实现...

  • 数据结构

    1 红黑树 红黑树与AVL的比较: AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红...

  • 重点汇总-python-gitbook-重要点学习-4-数据结构

    数据结构 - 红黑树 红黑树与AVL的比较: AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转...

网友评论

      本文标题:红黑树之左右旋转

      本文链接:https://www.haomeiwen.com/subject/giqssktx.html