免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1525 | 回复: 0
打印 上一主题 下一主题

教育未来---红黑树java实现代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-15 21:41 |只看该作者 |倒序浏览
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;
}

[ 本帖最后由 sakulagi 于 2008-5-4 13:29 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP