实现一个红黑树


enum Color{
    RED,BLACK;    
}
public class RedBlackTree {
    static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode father;
        Color color;
    }
    private TreeNode head;
    
    public RedBlackTree() {
    }
    
//    public void print() {
//        ArrayList<TreeNode> lists = new ArrayList<TreeNode>();
//        lists.add(head);
//        while(lists.size()>0) {
//            int size = lists.size();
//            for(int i=0;i<size;i++) {
//                TreeNode node = lists.remove(0);
//                if(node!=null)
//                    System.out.print(node.val+","+node.color.name()+" ");
//                else
//                    System.out.print("NIL,BLACK"+" ");
//                if(node!=null)
//                     lists.add(node.left);
//                if(node!=null)
//                     lists.add(node.right);
//            }
//            System.out.println();
//        }
//    }
    
    public void put(int val) {
        if(head==null) {
            TreeNode node = new TreeNode();
            node.color=Color.BLACK;
            node.val=val;
            head=node;
        }else{
            TreeNode node = new TreeNode();
            node.color = Color.RED;
            node.val=val;
            TreeNode start = head;
            while(true) {
                if(start.val>val) {
                    if(start.left!=null) {
                        start=start.left;
                    }else {
                        start.left=node;
                        node.father=start;
                        break;
                    }
                }else {
                    if(start.val<val) {
                        if(start.right!=null) {
                            start=start.right;
                        }else {
                            start.right=node;
                            node.father=start;
                            break;
                        }
                    }else {
                        break;
                    }
                }
            }
            RBINSERTFIXUP(node);
        }
    }

    private void RBINSERTFIXUP(TreeNode node) {
            //父节点为红色
            while(node.father!=null&&node.father.color==Color.RED) {
                //当前节点的父节点是祖父节点的左节点
                if(node.father.father.left==node.father) {
                    //叔叔节点
                    TreeNode uncle = node.father.father.right;
                    //如果叔叔节点是黑色节点
                    if(uncle==null||uncle.color==Color.BLACK) {
                        if(node.father.right==node) {
                              //如果当前节点是父节点的右节点
                              node = node.father;//将当前节点的父节点设置为当前节点
                              //左旋
                              TreeNode newFather = node.right;//当前节点的右节点是新的父节点
                              node.father.left=newFather;
                              newFather.father=node.father;
                              node.right=newFather.left;
                              node.father=newFather;
                              newFather.left=node;
                        }else {
                             //如果当前节点是父节点的左节点
                             node.father.color=Color.BLACK;//将父节点设置为黑色
                             node.father.father.color=Color.RED;//将祖父节点设置为红色
                             //以当前节点的父节点为支点进行右旋
                             TreeNode newBro = node.father.father;
                             node.father.father=newBro.father;
                             if(newBro.father!=null) {
                                 if(newBro.father.left==newBro) {
                                     newBro.father.left=node.father;
                                 }else {
                                     newBro.father.right=node.right;
                                 }
                             }else {
                                 head = node.father;
                             }
                             newBro.left=node.father.right;
                             if(newBro.left!=null)
                                  newBro.left.father=newBro;
                             node.father.right=newBro;
                             newBro.father=node.father;
                        }
                    }else {
                        node.father.color=Color.BLACK;//将父节点设置为黑色
                        node.father.father.color=Color.RED;//将祖父节点设置为红色
                        node.father.father.right.color=Color.BLACK;//将叔叔节点设置为黑色
                        node=node.father.father;
                        if(node.father==null) {
                            node.color=Color.BLACK;
                            head=node;
                            break;
                        }
                    }
                }else {
                    //叔叔节点
                    TreeNode uncle = node.father.father.left;
                    //如果叔叔节点是黑色节点
                    if(uncle==null||uncle.color==Color.BLACK) {
                        if(node.father.left==node) {
                              //如果当前节点是父节点的左节点
                              node = node.father;//将当前节点的父节点设置为当前节点
                              //右旋
                              TreeNode newFather = node.left;//当前节点的右节点是新的父节点
                              node.father.right=newFather;
                              newFather.father=node.father;
                              node.left=newFather.right;
                              node.father=newFather;
                              newFather.right=node;
                        }else {
                             //如果当前节点是父节点的右节点
                             node.father.color=Color.BLACK;//将父节点设置为黑色
                             node.father.father.color=Color.RED;//将祖父节点设置为红色
                             //以当前节点的父节点为支点进行左旋
                             TreeNode newBro = node.father.father;
                             node.father.father=newBro.father;
                             if(newBro.father!=null) {
                                 if(newBro.father.right==newBro) {
                                     newBro.father.right=node.father;
                                 }else {
                                     newBro.father.left=node.right;
                                 }
                             }else {
                                 head = node.father;
                             }
                             newBro.right=node.father.left;
                             if(newBro.right!=null) 
                                  newBro.right.father=newBro;
                             node.father.left=newBro;
                             newBro.father=node.father;
                        }
                    }else {
                        node.father.color=Color.BLACK;//将父节点设置为黑色
                        node.father.father.color=Color.RED;//将祖父节点设置为红色
                        node.father.father.left.color=Color.BLACK;//将叔叔节点设置为黑色
                        node=node.father.father;
                        if(node.father==null) {
                            node.color=Color.BLACK;
                            head=node;
                            break;
                        }
                    }
                }
            }
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值