首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

这个main函数的测试类要如何写才好呢,总是出错!如何实现二叉排序树的插入与删除呢?遍历已经实现了

2013-12-20 
这个main函数的测试类要怎么写才好呢,总是出错!怎么实现二叉排序树的插入与删除呢????遍历已经实现了.impo

这个main函数的测试类要怎么写才好呢,总是出错!怎么实现二叉排序树的插入与删除呢????遍历已经实现了.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BinTreeNode3{                                        //三叉链结点类
private BinTreeNode3 lChild,rChild,parent;                                 //左右孩子、双亲结点引用
private int data;
public BinTreeNode3(){ //无参构造函数
lChild=null;
rChild=null;
}
public BinTreeNode3(int item){                  //带参构造函数
lChild=null;
rChild=null;
data=item;
}


public BinTreeNode3(int item,BinTreeNode3 left,BinTreeNode3 right){
//构造函数
data=item;
lChild=left;
rChild=right;
}
public void setParent(BinTreeNode3 parent){//设置双亲指针
this.parent=parent;
}
public BinTreeNode3 getParent(){             //返回双亲指针
return parent;
}
public void setLeft(BinTreeNode3 left){//设置左孩子
lChild=left;
}
public BinTreeNode3 getLeft(){          //返回左孩子指针
return lChild;
}
public void setRight(BinTreeNode3 right){
                //设置右孩子
            rChild=right;
}


public BinTreeNode3 getRight(){
      //返回右孩子指针
return rChild;
}
public void setData(int data){                             
//设置数据域
this.data=data;
}


public int getData(){
     //设置数据域
return data;
}
 

public void insertBST(BinTreeNode3 Ra, BinTreeNode3 Rroot){
    //将Ra插入到以Rroot为根的二叉排序树中
if(Ra.getData()<Rroot.getData()){                                
//插入到左子树
if(Rroot.getLeft()==null){
//左孩子空,Ra作为左孩子
Rroot.setLeft(Ra);
Ra.setParent(Rroot);
//同时设置双亲指针
}
else
insertBST(Ra,Rroot.getLeft());
//左孩子非空,Ra插入左子树
}
else{           //插入到右子树
if(Rroot.getRight()==null){          //右孩子空,Ra作为右孩子
    Rroot.setRight(Ra);
    Ra.setParent(Rroot);           //同时设置双亲指针
}
else
    insertBST(Ra,Rroot.getRight());    //右孩子非空,Ra插入右子树
}
return ;
}


public  BinSearchTree  createSortTree(){   //创建二叉排序树
BinSearchTree tree = new BinSearchTree();   //创建二叉排序树对象
try {
int num;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
num = Integer.parseInt(in.readLine());   //输入整数
BinTreeNode3 Rroot, Ri;
Rroot = new BinTreeNode3(num);    //创建根结点
num = Integer.parseInt(in.readLine()); //输入整数
while (num != -1) { //当输入的字符是-1时结束创建
Ri = new BinTreeNode3(num); //创建新结点
insertBST(Ri, Rroot); //插入二叉排序树
num = Integer.parseInt(in.readLine()); //输入整数
}
tree.setRoot(Rroot); //设置对象根结点
} catch (Exception e) {
// TODO: handle exception
}    
return tree;
}
}




public class BinSearchTree{
        private BinTreeNode3 root;//根结点

        public BinSearchTree(){//构造函数
    root=null;
    }

public BinSearchTree(int item, BinSearchTree left, BinSearchTree right) {
        BinTreeNode3 l=null,r=null;
            if(left==null)
                l=null;
            else
                l=left.root;
            if(right==null)
                r=null;
            else


                r=right.root;
            root=new BinTreeNode3(item,l,r);
// TODO Auto-generated constructor stub
}

private void preOrder(BinTreeNode3 r,Visit vs){
               //前序遍历
            if(r!=null){
        vs.print(new Integer(r.getData()));
    preOrder(r.getLeft(),vs);
    preOrder(r.getRight(),vs);
    }
    }

private void inOrder(BinTreeNode3 r,Visit vs){
            //中序遍历
         if(r!=null){
 inOrder(r.getLeft(),vs);
 vs.print(new Integer(r.getData()));
 inOrder(r.getRight(),vs);
 }
 }

private void postOrder(BinTreeNode3 r,Visit vs){
            //后序遍历
         if(r!=null){
 postOrder(r.getLeft(),vs);
 postOrder(r.getRight(),vs);
 vs.print(new Integer(r.getData()));
 }
 }
       

public void setRoot(BinTreeNode3 r){//设置根结点
    root=r;
    }
public BinTreeNode3 getRoot(){//返回根结点
    return root;
    }
public BinTreeNode3 getLeft(BinTreeNode3 curr){//返回左孩子
    return curr!=null?curr.getLeft():null;
    }
public BinTreeNode3 getRight(BinTreeNode3 curr){//返回右孩子
    return curr!=null?curr.getRight():null;
    }
public void preOrder(Visit vs){//前序遍历
    preOrder(root,vs);
    }
public void inOrder(Visit vs){//中序遍历
    inOrder(root,vs);
    }
public void postOrder(Visit vs){//后序遍历
    postOrder(root,vs);
    }
    
    
public void insert(BinTreeNode3 p,int item){          //插入结点
    if(item<p.getData()){             //比较,获得插入位置
    if(p.getLeft()==null){//插入
    BinTreeNode3 temp=new BinTreeNode3(item);          //生成新结点
         temp.setParent(p);//设置双亲指针
         p.setLeft(temp);
     //插入结点作为左孩子
    }
    else
        insert(p.getLeft(),item);
                                            //在左子树插入
    }
    else if(item>p.getData()){                           //在右子树插入
            if(p.getRight()==null){
                                           //插入
    BinTreeNode3 temp=new BinTreeNode3(item);//生成新结点
        temp.setParent(p);                                       //设置双亲结点
    p.setRight(temp);                             
                                                        //插入结点作为右孩子
    }
    else
         insert(p.getRight(),item);
                //在右子树插入
    }
    return;
    }


public void delete(BinTreeNode3 p, int item){


            //删除结点
if(p!=null){
if(item<p.getData())           //在左子树中删除
delete(p.getLeft(),item);
       //在左子树中递归搜索
else if(item>p.getData())                                                          //在右子树中删除
delete(p.getRight(),item);
           //在右子树中递归搜索
else if(p.getLeft()!=null && p.getRight()!=null){                                                       //相等且该结点有左右子树
BinTreeNode3 temp;
temp=p.getRight();
  //查找右子树中的直接后继
while(temp.getLeft()!=null)             //找右子树的最左孩子
temp=temp.getLeft();
p.setData(temp.getData());        //复制数据域
delete(p.getRight(),temp.getData());    //递归删除p结点
}
else{
if(p.getLeft()==null && p.getRight()!=null){
                                            //左子树空
//p的双亲的右孩子指向p的右孩子
               p.getParent().setRight(p.getRight());
//p的右孩子的双亲指向p的双亲
               p.getRight().setParent(p.getParent());
}
else if(p.getRight()==null && p.getLeft()!=null)
                                           {//右子树空
    //p的双亲的左孩子指向p的左孩子
p.getParent().setLeft(p.getLeft());
//p的左孩子的双亲指针指向p的双亲
p.getLeft().setParent(p.getParent());
}
else{//无孩子结点,即叶子结点
BinTreeNode3 temp=p.getParent();
if(temp.getLeft()==p)//如果待删除结点在双亲的左孩子上
temp.setLeft(null);//双亲的左孩子指针置空
else//如果待删除结点在双亲的右孩子上
temp.setRight(null); //双亲的右孩子指针置空
}
}
}



public class Visit {
public void print(Object item){
System.out.print(item+"");

}


public static void main(String[] args) {
    // TODO Auto-generated method stub  
    BinSearchTree t4=new BinSearchTree(4,null,null);
    BinSearchTree t2=new BinSearchTree(2,t4,null);
    BinSearchTree t5=new BinSearchTree(5,null,null);
    BinSearchTree t7=new BinSearchTree(7,null,null);
    BinSearchTree t6=new BinSearchTree(6,null,t7);
    BinSearchTree t3=new BinSearchTree(3,t5,t6);
    BinSearchTree t =new BinSearchTree(1,t2,t3);
    Visit vs=new Visit();
    System.out.println("前序");
    t.preOrder(t.getRoot(),vs);
    System.out.println("\r\n中序");
    t.inOrder(t.getRoot(),vs);
    System.out.println("\r\n后序");
    t.postOrder(t.getRoot(),vs);
    BinTreeNode3 p=new BinTreeNode3();
    System.out.println("Insert a number into the tree:");
    //t.insert(t.getRoot(),p);
    }



    }




排序树 二叉树 java main函数
[解决办法]
理论上说你只需要构架一个root,其它的值是call insert()来插入进去的。插入的时候按规则自动形成tree的枝干,而不是你构架很多tree然后手动的拼接,这样就没有意义了。

热点排行