`
shaojiashuai123456
  • 浏览: 262139 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

二叉查找树 --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);   

	}

}

 

分享到:
评论

相关推荐

    二叉查找树java

    在Java中,我们可以用类来表示二叉查找树的节点。一个简单的节点类可以这样定义: ```java public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; left = ...

    Java实现二叉排序树

    二叉排序树(Binary Sort Tree...在Java中实现二叉排序树时,我们需要考虑其基本操作的逻辑,并注意处理好边界条件和异常情况,以确保代码的正确性和健壮性。同时,为了优化性能,可以考虑使用自平衡的二叉排序树变体。

    课程设计——二叉查找树

    如果是源代码,它可能用C++、Java或Python等编程语言编写,展示了二叉查找树的插入、删除和查找等基本操作的算法实现。如果是数据文件,它可能存储了预构建的二叉查找树,用户可以直接在程序中查看和操作这个树。 ...

    二叉查找树实现源码(C、C++、JAVA)

    这些基本操作是构建高效数据结构的基础,理解并熟练掌握二叉查找树的实现,对提升算法能力和编写高效代码至关重要。在实际应用中,二叉查找树常用于数据库索引、文件系统等场景,其性能优势在于能够快速定位和访问...

    二叉排序树查找算法

    二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特点是:对于任意节点,其左子树中的所有...

    二分搜索树-二叉查找树 .docx

    二分搜索树,又称二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点都遵循以下规则: 1. 节点的左子树仅包含键值小于该节点的节点。 2. 节点的右子树仅包含键值大于该节点的节点。 3. 左右子树同样也是...

    二叉排序树问题

    **二叉排序树问题**是数据结构课程设计中常见的一个课题,旨在让学生深入理解并实践二叉树、查找表的逻辑结构和存储结构。在这个任务中,学生需要设计一个程序来实现二叉排序树的基本操作,同时提升自身的编程能力和...

    java课程设计二叉排序树

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。在Java中,我们可以利用面向对象编程的概念来实现二叉排序树...

    二叉排序树增删改查

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性: 1. 每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个指向右子节点的引用。 2. ...

    数据结构之二叉排序树的生成

    二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的数据结构,它具有以下特性:对于树中的任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中所有节点的值都大于该节点的值。这种特性使得在二叉...

    java二叉查找树的实现代码

    "java二叉查找树的实现代码" 本文主要介绍了java二叉查找树的实现代码,具有一定的参考价值。下面是对标题、描述、标签和部分内容的详细解释和知识点总结。 一、标题和描述 标题中提到了java二叉查找树的实现代码...

    数据结构二叉平衡树课程设计

    - **红黑树**:一种自平衡二叉查找树,由Rudolf Bayer于1972年提出。每个节点都有颜色属性,可以是红色或黑色,通过一定的规则保证了任何路径到叶子节点的长度最多为两倍的黑色节点。 - **Splay树**:自适应的平衡...

    二叉搜索树的源码,加上注释和自己理解

    `BST.java`很可能是二叉搜索树的实现,`TreeDoc.java`可能包含了关于数据结构或树操作的文档,而`BSTMain.java`应该是主程序,用于测试和展示二叉搜索树的功能。 在`BST.java`中,二叉搜索树的节点可能包含以下属性...

    java实现二叉排序树

    二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。在二叉排序树中,每个节点都包含一个键值,对于任意节点,其左子树中的所有节点的键值小于该节点的键值,而...

    java 二叉排序树与平衡二叉树的实现

    9. **console**:可能包含控制台交互的代码,用于通过命令行输入进行树的插入、查找和删除操作。 10. **algorithm**:可能是一个包含各种算法实现的文件夹,如二叉排序树和平衡二叉树的插入、查找和删除算法。 ...

    算法-理论基础- 查找- 二叉排序树(包含源程序).rar

    二叉排序树,又称二叉查找树或二叉搜索树,是计算机科学中一种非常重要的数据结构,主要用于高效地进行查找、插入和删除操作。它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子...

    java 二叉查找树实例代码

    Java 二叉查找树实例代码详解 Java 二叉查找树是一种特殊的二叉树,它的左子树的所有节点值小于根节点值,右子树的所有节点值大于根节点值。这种树结构使得查找、插入、删除操作的时间复杂度都降低到了O(log n)。...

    平衡二叉排序树的算法实现

    2. **红黑树**:红黑树是一种自平衡的二叉查找树,由R. H. Sedgewick提出。它的每个节点都有颜色属性,可以是红色或黑色,满足以下性质:根节点是黑色;所有叶子节点(NIL节点)是黑色;如果一个节点是红色,则其子...

    二叉排序树java代码,能直接运行且有代码注释

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在处理大量数据时具有高效性,特别是对于插入、删除和查找操作。在二叉排序树中,每个节点的左子树中的所有...

    二叉排序树

    二叉排序树,又称二叉查找树或二叉搜索树,是计算机科学中一种非常重要的数据结构,尤其在处理搜索和排序操作时表现突出。它是一种特殊的二叉树,每个节点都满足以下两个条件: 1. 左子树中的所有节点的值都小于该...

Global site tag (gtag.js) - Google Analytics