二叉查找树 --java代码

代码可能写的不够好,不过是爱心代码,宝贝要看懂哦!

 

(1)tree接口 

所有的树,都要实现这样的接口

Tree.java 文件

public interface Tree {
    public int get_count();
    public void   insert(Object obj);
    public void   delete(Object obj);
    public Object search(Object obj);
    public void display();    
}

(2)TreeCompare 接口

此接口原来在比较书中对象时使用,由于书中存储的对象不同,使用的比较方法不同

TreeCompare.java文件

public interface TreeCompare {
      public int compare(Object node_value,Object search_value);
}
(3)MyTree的实现

 MyTree.java文件

 

//树节点
class TreeNode
{
	TreeNode left;  //左子树
	TreeNode right; //右子树
	Object   value; //存储值
	/*属性的获取和设置方法*/
	public TreeNode getLeft() {
		return left;
	}
	
	public void setLeft(TreeNode left) {
		this.left = left;
	}
	
	public TreeNode getRight() {
		return right;
	}
	
	public void setRight(TreeNode right) {
		this.right = right;
	}
	
	public Object getValue() {
		return value;
	}
	
	public void setValue(Object value) {
		this.value = value;
	}
	
    /*构造函数*/
	public TreeNode()
	{
		this.left=null;
		this.right=null;
		this.value=null;
	}
	public TreeNode(Object value)
	{
		this.left=null;
		this.right=null;
		this.value=value;
	}
}
//树中存储的对象为Integer类型,所以自己实现一个比较接口
class MyTreeCompare implements TreeCompare{
	  public int compare(Object node_value,Object search_value)
	 {
		 Integer a=(Integer)node_value;
	     return a.compareTo((Integer)search_value);
	 }
}
//自己的树
public class MyTree implements Tree {
	
	TreeNode root;           //树根
	int count;               //节点数
	TreeCompare compare_method;     //比较函数
	
	//子树最大值   
	private TreeNode tree_node_max(TreeNode node)   
	{   
		    //一直向右,最右边的是最大的
	        while(node.getRight()!=null)   
	        {   
	              node=node.getRight();   
	        }   
	        return node;   
	}   
	  
	//子树最小值   
	private TreeNode tree_node_min(TreeNode node)   
	{   
		 //一直向左,最左边的是最大的
        while(node.getLeft()!=null)   
        {   
              node=node.getLeft();   
        }   
        return node;    
	} 
	
	//递归插入一个节点    
	/*  
	     算法解释:  
	     插入一个节点,首先要看是否已经存在,也就是先查找,  
	     所以要不断的递归进行比较。  
	       
	     (1)如果一直到NULL,也就是没有找到,说明插入的为新节点,  
	         需要创建新的节点。  
	     (2)如果相等,说明已经存在,不需要再插入了,则返回即可  
	     (3)如果不相等,根据大小插入节点的左子树或者右子树  
	*/  
	TreeNode tree_node_insert(TreeNode node,Object value)   
	{   
		  //如果没有比较方法,不能插入
		  if(this.compare_method==null)
		  {
			  return null;
		  }
	      //节点为空表明已经查找到了叶子,插入的值为新值,需要创建新的节点    
	      if(node==null)   
	      {   
	            this.count++;       
	            return new TreeNode(value);   
	      }   
	      //如果插入值等于节点值,说明已经存在,无需插入,直接返回    
	      else if(this.compare_method.compare(node.getValue(),value)==0)   
	      {   
	            return node;                                    
	      }   
	      //如果插入值大于节点值,继续往右子树插入    
	      else if(this.compare_method.compare(node.getValue(),value)<0)   
	      {   
	            node.setRight(tree_node_insert(node.getRight(),value));   
	            return node;  
	      }   
	      //如果插入值小于节点值,继续往左子树插入    
	      else  
	      {   
	            node.setLeft(tree_node_insert(node.getLeft(),value));   
	            return node;   
	      }   
	} 
	
	// 递归删除一个节点   
	  
	/*  
	     算法解释:  
	     删除一个节点,删除和插入很像,不过要复杂点。  
	     也要先查找点,不过找到要执行删除操作,没找到反而不用干什么。  
	       
	     (1)如果为NULL,说明没找到,只要返回NULL就行了  
	     (2)如果相等,说明已经存在要删除的节点,那就需要删除此节点了  
	         1)如果此节点左右子树都为空,那就直接删除节点,返回NULL就行  
	         2)如果此节点左子树不空,而右子树为空,删除节点,返回左子树  
	         3)如果此节点右子树不空,而左子树为空,删除节点,返回右子树  
	         4)如果左右子树都不空,那就需要早到左子树中最大的数或则右子树  
	            中最小的值,替换到要删除的值,然后在左子树中删除最大的节点  
	            或者右子树删除最小的节点。  
	     (3)如果不相等,根据大小删除节点  
	*/  
	TreeNode tree_node_delete(TreeNode node,Object value)   
	{   
	     //如果为NULL,说明没找到,只要返回NULL就行了   
	      if(node==null)   
	      {   
	            return null;   
	      }   
	     //如果相等,说明已经存在要删除的节点,那就需要删除此节点了   
	      else if(this.compare_method.compare(node.getValue(),value)==0)   
	      {   
	           TreeNode left=node.getLeft();   
	           TreeNode right=node.getRight();   
	           this.count--;
	           
	           //如果此节点左右子树都为空,那就直接删除节点,返回NULL就行   
	            if(left==null&&right==null)         
	            {   
	                  return null;  
	            }   
	           //如果此节点左子树不空,而右子树为空,删除节点,返回左子树   
	           else  if(left!=null&&right==null)         
	           {     
	                return left;   
	           }   
	           //如果此节点右子树不空,而左子树为空,删除节点,返回右子树   
	           else if(left==null&&right!=null)         
	            {    
	                return right;   
	            }   
	        //如果左右子树都不空,那就需要早到左子树中最大的数   
	        //替换到要删除的值   
	        //然后在左子树中删除最大的节点   
	        //返回节点   
	        else  
	        {   
	               TreeNode max=tree_node_max(left);   
	               node.setValue(max.getValue());  
	               node.setLeft(tree_node_delete(left,max.getValue()));   
	               return node;   
	        }   
	        
	         
	      }   
	     //如果不相等,根据大小删除节点   
	      else if(this.compare_method.compare(node.getValue(),value)<0)   
	      {   
	            node.setRight(tree_node_delete(node.getRight(),value));   
	            return node;  
	      }   
	      //如果插入值小于节点值,继续往左子树插入    
	      else  
	      {   
	            node.setLeft(tree_node_delete(node.getLeft(),value));   
	            return node;   
	      }   
	}   

	//查找
	TreeNode tree_node_search(TreeNode node,Object value)   
	{   
	      //没有找到,直接返回  
	      if(node==null)   
	      {       
	            return null;   
	      }   
	      //找到,直接返回    
	      else if(this.compare_method.compare(node.getValue(),value)==0)   
	      {   
	            return node;                                    
	      }   
	      //继续往右子树查找
	      else if(this.compare_method.compare(node.getValue(),value)<0)   
	      {   
	            return tree_node_search(node.getRight(),value);     
	      }   
	      //继续往左子树查找
	      else  
	      {   
	            return tree_node_search(node.getLeft(),value);     
	      }   
	} 
	
	//先序遍历
	void display_tree_node(TreeNode node)   
	{   
	     if(node!=null)   
	     {   
	          System.out.print(" ["+node.getValue()+"]");  
	          display_tree_node(node.getLeft());   
	          display_tree_node(node.getRight());   
	     }   
	}    

	/*下面是对外的Tree接口实现*/
	
	public void delete(Object obj) {
		// TODO Auto-generated method stub
         this.root=this.tree_node_delete(this.root,obj);
	}

	public int get_count() {
		// TODO Auto-generated method stub
		return this.count;
	}

	public void insert(Object obj) {
		// TODO Auto-generated method stub
        this.root=this.tree_node_insert(this.root,obj);
	}

	public Object search(Object obj) {
		// TODO Auto-generated method stub
	     TreeNode node=tree_node_search(this.root,obj);   
	     if(node!=null)   
	     {   
	          return node.getValue();   
	     }   
	     else  
	     {   
	          return null;   
	     }  
	}
	
	 public void display()
	 {
		// TODO Auto-generated method stub
		 display_tree_node(this.root);
		 System.out.println();
	 }

	 public MyTree()
	 {
		 this.root=null;
		 this.count=0;
		 this.compare_method=null;
	 }
	 
	 public MyTree(TreeCompare compare)
	 {
		 this.root=null;
		 this.count=0;
		 this.compare_method=compare;
	 }
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
          Tree tree=new MyTree(new MyTreeCompare());
	      Integer  a=new Integer("1");   
	      Integer  a1=new Integer("1"); 
	      Integer  b=new Integer("2");   
	      Integer  c=new Integer("3");     
	      Integer  d=new Integer("0");      
	      Integer  e=new Integer("5");      
	      //插入a    
	      System.out.println("插入"+a); 
	      tree.insert(a);   
	      tree.display();
	      System.out.println("插入"+a); 
	      tree.insert(a);   
	      tree.display();
	      System.out.println("插入"+b); 
	      tree.insert(b);   
	      tree.display(); 
	      System.out.println("插入"+c); 
	      tree.insert(c);   
	      tree.display();  
	      System.out.println("插入"+d); 
	      tree.insert(d);   
	      tree.display(); 
	  
	      //查找   
	      if(tree.search(a)!=null)   
	      {   
	    	  System.out.println("查找"+a+": 找到");   
	      }   
	      else  
	      {   
	    	  System.out.println("查找"+a+": 没有找到");   
	      }   
	      //查找   
	      if(tree.search(e)!=null)   
	      {   
	    	  System.out.println("查找"+e+": 找到");   
	      }   
	      else  
	      {   
	    	  System.out.println("查找"+e+": 没有找到");   
	      }    
	         
	  
	   //删除节点a   
	   System.out.println("删除"+a1);   
	   tree.delete(a1);   
	   tree.display();   
	   //删除节点c   
	   System.out.println("删除"+c);   
	   tree.delete(c);   
	   tree.display();  
	   //删除节点d   
	   System.out.println("删除"+d);   
	   tree.delete(d);   
	   tree.display();  
	   //删除节点b   
	   System.out.println("删除"+b);   
	   tree.delete(b);   
	   tree.display(); 
	   //删除节点a   
	   System.out.println("删除"+a);   
	   tree.delete(a);   

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值