红黑树-实现

作者: 奔跑的蛙牛 | 来源:发表于2019-01-29 00:25 被阅读0次
package com.example.demo2;

/**
 * 推荐一本非常详细的树<算法> 第四版java 实现。想要的话下方评论哈
 * @param <Key>
 * @param <Value>
 */
public class RBTree<Key extends Comparable<Key>,Value> {
    private Node root;
    // 左旋:把右链接为红色的节点变成左链接红色
    Node rolateLeft(Node h){
        Node x = h.right;
        h.right = x.left;
        x.left = h;
        x.color = Color.BLACK.getIsRed();
        x.N = h.N;
        h.N = 1 + size(h.left) + size(h.right);
        return null;
    }
    public int size(Node x){
        if(x == null) return 0;
        return x.left.N + x.right.N;
    }

    // 右旋:把红色左链接变为红色右链接
    Node rolateRight(Node h){
        Node x = h.left;
        h.left = x.right;
        x.right = h;
        x.color = h.color;
        h.color = Color.RED.getIsRed();
        x.N = h.N;
        h.N = 1 + size(h.left) + size(h.right);
        return x;
    }
    private boolean isRed(Node x){
        if(x == null) return false;
        return x.color == Color.RED.getIsRed();
    }
    /**
     * 红黑树插入分为 向单个2-结点插入键值对 1、左链接为红色 2、右链接为红色 需要旋转
     * 向树底部插入新键 如果出现红色右链接需要发生左旋
     * 向一颗双键树插入新键 1、新键最大 2、新健最小 3、新键介于两者之间
     * 红链接需要向上传递
     * @param key
     * @param value
     */
    public void put(Key key,Value value){
        root = put(root,key,value);
        root.color = Color.BLACK.getIsRed();
    }


    public Node put(Node h,Key key,Value value){
        if(h == null) return new Node(key,value,1,Color.RED.getIsRed());
        int cmp = key.compareTo((Key) h.key);
        if (cmp<0) h.left = put(h.left,key,value);
        else if(cmp>0) h.right = put(h.right,key,value);
        else h.val = value;
        if(isRed(h.right) && !isRed(h.left)) h = rolateLeft(h);
        if(isRed(h.left) && isRed(h.left.left)) h = rolateRight(h);
        if (isRed(h.left) && isRed(h.right)) flipColors(h);
        h.N = size(h.left) + size(h.right);
        return h;
    }
    public void flipColors(Node h){
        h.color = Color.RED.getIsRed();
        h.left.color = Color.BLACK.getIsRed();
        h.right.color = Color.BLACK.getIsRed();
    }
}

// 结点 
package com.example.demo2;

// 红黑树节点数据类型
public class Node<Key extends Comparable<Key>,Value> {
    Key key;
    Value val;
    Node left,right;
    int N; // 子树中的节点总数
    boolean color;
    Node(Key key,Value value,int N,boolean color){
        this.key = key;
        this.val = value;
        this.N = N;
        this.color = color;
    }
}

// color 
package com.example.demo2;


public enum Color {
    RED("红色", true), BLACK("黑色", false);
    private String name;
    private boolean isRed;

    Color(String name, boolean isRed) {
        this.name = name;
        this.isRed = isRed;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean getIsRed() {
        return isRed;
    }

    public void setIsRed(boolean isRed) {
        this.isRed = isRed;
    }
}



相关文章

  • STL源码解析(1)-红黑树

    STL源码解析(1)-红黑树 STL容器之红黑树实现 C++中map和set都是基于红黑树的实现, 其迭代器也是红...

  • 拿下红黑树

    红黑树 红黑树、2-3树的简单定义: 实现红黑树的基本结构以及添加操作(维护定义,左旋、右旋、颜色反转) 红黑树与...

  • 树-红黑树和AVL树的区别

    TreeSet与TreeMap的底层实现都是红黑树 1 概念 什么是红黑树? 红黑树(Red Black Tree...

  • 红黑树

    红黑树图Java在实现TreeMap中用到了红黑树,在此记录自己的理解。 定义 红黑树是二叉搜索树的一种实现方式,...

  • 数据结构学习_02红黑树平衡操作

    参考文章 : 红黑树原理解析以及Java实现 红黑树(五)之 Java的实现 废话不多说, 直接开始分析 一、红黑...

  • 24-集合

    一、用链表实现集合 Set类 ListSet类 二、用红黑树实现集合 TreeSet类 用红黑树实现集合(Tree...

  • 算法与数据结构系列之[红黑树-下]

    上篇介绍了红黑树的概述,这篇贴出红黑树的java实现代码。

  • TreeMap源码阅读

    一、红黑树简介 TreeMap是通过红黑树实现的,增删改查的操作底层都是对红黑树的相关操作,因此先介绍红黑树的相关...

  • 红黑树笔记

    红黑树:R-B Tree [toc]参考:红黑树(一)之 原理和算法详细介绍红黑树(五)之 Java的实现 1 简...

  • 红黑树实现

    具体算法理论参照<<算法导论>>,还有一个能可视化显示红黑树结构和操作的网站https://www.cs.usfc...

网友评论

    本文标题:红黑树-实现

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