一棵没实现删除的红黑树

来源:互联网 发布:网络写手排行榜2016 编辑:程序博客网 时间:2024/06/13 05:31
除了删除节点之外,把红黑树基本上看完了,顺手用java实现了一棵红黑树
import javax.swing.*;/** * Created by eminem on 16-11-15. */public class brTree {    private Node root;    private static final boolean RED = true;    private static final boolean BLACK = false;    private class Node {        String key;        int value;        Node left, right;        int N;        boolean color;        public Node(String key, int value, int N, boolean color) {            this.key = key;            this.value = value;            this.N = N;            this.color = color;        }    }    private boolean isRed(Node x) {        //空链接那么他就是black        if (x == null) return false;        return x.color == RED;    }    int size(Node shit) {        if (shit == null) return 0;        else return shit.N;    }    Node rotateLfet(Node h) {        Node x = h.right;        h.right = x.left;        x.left = h;        x.color = h.color;        h.color = RED;        x.N = h.N;        h.N = size(h.left) + size(h.right) + 1;        return x;    }    Node rotateRight(Node h) {        Node x = h.left;        h.left = x.right;        x.right = h;        x.color = h.color;        h.color = RED;        x.N = h.N;        h.N = size(h.left) + size(h.right) + 1;        return x;    }    private void flipColors(Node shit) {        shit.color = RED;        shit.left.color = BLACK;        shit.right.color = BLACK;    }    public void put(String key, int value) {        root = put(root, key, value);        root.color = BLACK;    }    private Node put(Node shit, String key, int value) {        if (shit == null) {            return new Node(key, value, 1, RED);        }        int cmp = key.compareTo(shit.key);        if (cmp < 0) shit.left = put(shit.left, key, value);        else if (cmp > 0) shit.right = put(shit.right, key, value);        else shit.value = value;        if (isRed(shit.right) && !isRed(shit.left)) shit = rotateLfet(shit);        if (isRed(shit.left) && isRed(shit.left.left)) shit = rotateRight(shit);        if (isRed(shit.left) && isRed(shit.right)) flipColors(shit);        shit.N = size(shit.left) + size(shit.right) + 1;        return shit;    }    public int get(String key) {        return get(root, key);    }    private Integer get(Node x, String key) {        if (x == null) return null;        int cmp = key.compareTo(x.key);        if (cmp > 0) {            return get(x.right, key);        } else if (cmp < 0) {            return get(x.left, key);        } else {            return x.value;        }    }    public String min() {        return min(root).key;    }    private Node min(Node x) {        if (x.left == null) return x;        return min(x.left);    }    public String max() {        return max(root).key;    }    private Node max(Node x) {        if (x.right == null) return x;        return max(x.right);    }    public String floor(String key) {        Node x = floor(root, key);        if (x == null) return null;        return x.key;    }    private Node floor(Node x, String key) {        if (x == null) return null;        int cmp = key.compareTo(x.key);        if (cmp == 0) return x;        if (cmp < 0) return floor(x.left, key);        Node t = floor(x.right, key);        if (t != null) return t;        else return x;    }    //找到排名为k的键    public String select(int k) {        return select(root, k).key;    }    private Node select(Node x, int k) {        if (x == null) return null;        int t = size(x.left);        if (t > k) return select(x.left, k);        else if (t < k) return select(x.right, k - t - 1);        else return x;    }    public int rank(String key) {        return rank(root, key);    }    private Integer rank(Node x, String key) {        //始终没命中,已到树的末尾        if (x == null) return 0;        int cmp = key.compareTo(x.key);        if (cmp < 0) return rank(x.left, key);        else if (cmp > 0) return 1 + size(x.left) + rank(x.right ,key);        else return size(x.left);    }}
//md这些算法的发明者也是吊,怎么想出来的啊这东西
测试类如下:
/** * Created by eminem on 16-11-17. */public class brTestt {    public static void main(String[] args) {        brTree fuck=new brTree();        fuck.put("a",1);        fuck.put("b",2);        fuck.put("c",3);        fuck.put("d",4);        fuck.put("e",5);        fuck.put("f",6);        fuck.put("g",7);        fuck.put("h",8);        System.out.println(fuck.select(7));        System.out.println(fuck.get("a"));        System.out.println(fuck.floor("o"));            }}


                                             
0 0
原创粉丝点击