Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3472400
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: Java

2008-04-16 21:25:21

public class RBTree{
    TreeNode root;

    //建立红黑树
    public void create(int[] list){
        for(int i = 0; i < list.length; i++){
            this.insert(list);
        }
    }

    //插入一个元素
    public void insert(int elem){//为新元素开辟一个空间
        TreeNode s = new TreeNode();
        s.data = elem;
        s.color = "red";
        s.lchild = null;
        s.rchild = null;

        //判断根是否为空,如果为空,则将root指向新元素.否则,进入循环
        if(root == null){
            root = s;
            root.color = "black";
            return ;
        }else{
            //定义四个指针,分别指向祖先,祖,父,自身
            TreeNode p = root,q;
            TreeNode parent = root;
            TreeNode grand = root;
            TreeNode ancestor = root;
            while(p != null){
                //如果P的左右孩子均不为空且颜色均为红色,则执行颜色转换并进行调整
                if(p.lchild != null && p.rchild != null){
                    if(p.lchild.color==("red") && p.rchild.color==("red")){
                        convertColor(p);
                        adjust(ancestor,grand,parent,p);
                    }
                }

                if(elem == p.data){
                    return;
                }

                q = p; //指针依次向后移动
                ancestor = grand;
                grand = parent;
                parent = p;

                //如果,元素小于P
                if(elem < q.data){ //P的左孩子为空
                    if(q.lchild == null){
                        //将P的左孩子指向新建元素
                        q.lchild = s;
                        p = s; //调整
                        adjust(ancestor,grand,parent,p);
                        return;
                    }else{//P的左孩子不为空
                        //P向左下移动
                        p = p.lchild;
                    }
                } else{//如果,元素大于P
                    if(elem > q.data){ //P的右孩子为空
                        if(q.rchild == null){
                            //将P的右孩子指向新建元素
                            q.rchild = s;
                            p = s;//调整
                            adjust(ancestor,grand,parent,p);
                            return;
                        }else{//P的右孩子不为空
                            //P向右下移动
                            p = p.rchild;
                        }
                    }
                }
            }
        }
    }

    //调整颜色的方法
    public void convertColor(TreeNode p){
        //将P的左右孩子的颜色均置为黑
        p.lchild.color = "black";
        p.rchild.color = "black";
        //若P为根结点,则颜色仍为黑,否则颜色置为红
        if(!(p.equals(root))){
            p.color = "red";
            return;
        }
        if(p.equals(root)){
            p.color = "black";
        }
    }

    public void adjust(TreeNode ancestor,TreeNode grand,TreeNode parent,TreeNode x){//是否存在红红冲突
        if(!(parent.color == "red" && x.color == "red")){
            return;
        }
        //符合一次调整的,将调用一次调整
        if((grand.lchild == parent && parent.lchild == x) ||(grand.rchild == parent && parent.rchild == x )){
            onceAdjust(ancestor,grand,parent,x);
            return;
        }
        //符合二次调整的,将调用二次调整
        if((grand.lchild == parent && parent.rchild == x ) || (grand.rchild == parent && parent.lchild == x )){
            twiceAdjust(ancestor,grand,parent,x);
            return;
        }
    }

    private void onceAdjust(TreeNode ancestor,TreeNode grand,TreeNode parent,TreeNode x){ //调整父结点和祖结点的颜色
        this.exchangeColor(grand);
        this.exchangeColor(parent);
        //将祖先结点指向父结点
        if(ancestor ==  grand && ancestor == this.root ){
            this.root = parent;
            ancestor = parent;
        }else{
            if(ancestor.lchild == grand){
                ancestor.lchild = parent;
            }else if(ancestor.rchild == grand){
                ancestor.rchild = parent;
            }
        }

        //左左型调整
        if(grand.lchild == parent && parent.lchild == x ){
            grand.lchild = parent.rchild;
            parent.rchild = grand;
            return;
        }

        //右右型调整
        if(grand.rchild == parent && parent.rchild == x ){
            grand.rchild = parent.rchild;
            parent.lchild = grand;
            return;
        }
    }
   
    private void twiceAdjust(TreeNode ancestor,TreeNode grand,TreeNode parent,TreeNode x){ //调整自身结点和祖结点的颜色
        this.exchangeColor(grand);
        this.exchangeColor(x);
        //将祖先结点指向自身结点
        if(ancestor == grand && ancestor == root){
            root = x;
            ancestor = x;
        }else{
            if(ancestor.lchild == grand){
                ancestor.lchild = x;
            }else if(ancestor.rchild == grand){
                ancestor.rchild = x;
            }else if(ancestor == root){
                ancestor = x;
                root = x;
            }
        }

        //左右型调整
        if(grand.lchild == parent && parent.rchild == x ){
            grand.lchild = x.rchild;
            parent.rchild = x.lchild;
            x.lchild = parent;
            x.rchild = grand;
            return;
        }

        //右左型调整
        if(grand.rchild == parent && parent.lchild == x){
            grand.rchild = x.lchild;
            parent.lchild = x.rchild;
            x.lchild = grand;
            x.rchild = parent;
            return;
        }
    }

    //变换颜色的方法
    private void exchangeColor(TreeNode p){
        if(p.color.equals("red")){
            p.color = "black";
        }else{
            p.color = "red";
        }
    }

    public void inorder(){
        inorder(root);
    }
   
    //中序遍历
    private void inorder(TreeNode root){
        if(root != null){
            inorder(root.lchild);
            System.out.println(root.data+"  "+root.color);
            inorder(root.rchild);
        }
    }
}

class TreeNode{
    public int data;
    public String color;
    public TreeNode lchild;
    public TreeNode rchild;
}
阅读(658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~