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

二叉查找树 -java代码

2012-12-26 
二叉查找树 --java代码代码可能写的不够好,不过是爱心代码,宝贝要看懂哦!?(1)tree接口?所有的树,都要实现

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

?

热点排行