通用数据结构树—Java语言实现

树是一种常见的数据结构,得到了非常广泛的应用如文件系统、目录结构、霍夫曼编码等。根据树的特点及应用场景,我们通常会遇到二叉树、平衡树、红黑树、竞赛树、B树等。

在C、C++语言中我们在实现树时需要用到指针,如在二叉树中,我们会用指针指向左子树和右子树。在Java语言中并没有指针,但道理是类似的,我们使用对象来引用左子树和右子树。

下面是自己闲来无事时用Java语言实现的树,这不是一棵二叉树,而是一棵普通的树。提供了树了创建、层次遍历、查找等基本方法。

1.NodeData 是树中的节点或叶子存储的数据内容,可进行随意扩展

package  com.eyecm.tree ;

/**
 * 树上每个节点存放的数据
 * 
 */

public  class NodeData
{
     private  String username ;
     private  String content ;

     public NodeData ( )
     {

     }

     public NodeData ( String username,  String content )
     {
         this. username  = username ;
         this. content  = content ;
     }

     public  void output ( )
     {
         System. out. println (username  +  " "  + content ) ;
     }
}

2.TredNode 是树的节点或叶子的抽象,提供层次遍历、查找等操作

package  com.eyecm.tree ;

import  java.util.ArrayList ;
import  java.util.LinkedList ;
import  java.util.Queue ;

/**
 * 树的节点
 * 
 */

public  class  TreeNode
{
     private  int id ;
     private  TreeNode parent ;
     private ArrayList <TreeNode > children ;
     private NodeData data ;

     public  TreeNode ( int id,  TreeNode parent, ArrayList <TreeNode > children,
            NodeData data )
     {
         super ( ) ;
         this. id  = id ;
         this. parent  = parent ;
         this. children  = children ;
         this. data  = data ;
     }

     public  int getId ( )
     {
         return id ;
     }

     public  void setId ( int id )
     {
         this. id  = id ;
     }

     public  TreeNode getParent ( )
     {
         return parent ;
     }

     public  void setParent ( TreeNode parent )
     {
         this. parent  = parent ;
     }

     public ArrayList <TreeNode > getChildren ( )
     {
         return children ;
     }

     public  void setChildren (ArrayList <TreeNode > children )
     {
         this. children  = children ;
     }

     public NodeData getData ( )
     {
         return data ;
     }

     public  void setData (NodeData data )
     {
         this. data  = data ;
     }

     /**
     * 当前节点是否是根节点
     * 
     * @return
     */

     public  boolean isRoot ( )
     {
         if  ( this. parent  ==  null )
         {
             return  true ;
         }  else
         {
             return  false ;
         }
     }

     /**
     * 当前节点是否是叶子节点
     * 
     * @return
     */

     public  boolean isLeaf ( )
     {
         if  ( this. children  ==  null  ||  this. children. size ( )  ==  0 )
         {
             return  true ;
         }  else
         {
             return  false ;
         }
     }

     /**
     * 对该节点及其子树进行层次遍历
     * 
     * @param treeNode
     */

     public  static  void levelTraversal ( TreeNode treeNode )
     {
         if  (treeNode  ==  null )
         {
             return ;
         }
         if  (treeNode. isLeaf ( ) )
         {
            treeNode. data. output ( ) ;
         }  else
         {
            Queue <TreeNode > queue  =  new LinkedList <TreeNode > ( ) ;
            queue. offer (treeNode ) ;
             while  (queue. size ( )  >  0 )
             {
                 TreeNode node  = queue. poll ( ) ;
                node. data. output ( ) ;

                 if  (node. isLeaf ( )  ==  false )
                 {
                     for  ( int i  =  0 ; i  < node. children. size ( ) ; i ++ )
                     {
                        queue. offer (node. children. get (i ) ) ;
                     }
                 }
             }
         }
     }

     /**
     * 查找特点的节点,在此使用层次遍历进行查找
     * 
     * @param id
     * @param treeNode
     * @return
     */

     public  static  TreeNode search ( int id,  TreeNode treeNode )
     {
         if  (treeNode  ==  null )
         {
             return  null ;
         }
         if  (treeNode. isLeaf ( ) )
         {
             if  (treeNode. id  == id )
             {
                 return treeNode ;
             }  else
             {
                 return  null ;
             }
         }  else
         {
            Queue <TreeNode > queue  =  new LinkedList <TreeNode > ( ) ;
            queue. offer (treeNode ) ;
             while  (queue. size ( )  >  0 )
             {
                 TreeNode node  = queue. poll ( ) ;
                 if  (node. id  == id )
                 {
                     return node ;
                 }

                 if  (node. isLeaf ( )  ==  false )
                 {
                     for  ( int i  =  0 ; i  < node. children. size ( ) ; i ++ )
                     {
                        queue. offer (node. children. get (i ) ) ;
                     }
                 }
             }

             return  null ;
         }
     }

     /**
     * 将节点插入为另一个节点的孩子
     * 
     * @param childNode
     * @param toBeAppended
     * @return
     */

     public  static  boolean appendAsChild ( TreeNode childNode,
             TreeNode toBeAppended )
     {
         if  (childNode  ==  null  || toBeAppended  ==  null )
         {
             return  false ;
         }  else
         {
             if  (toBeAppended. isLeaf ( ) )
             {
                ArrayList <TreeNode > children  =  new ArrayList <TreeNode > ( ) ;
                children. add (childNode ) ;
                toBeAppended. children  = children ;
             }  else
             {
                toBeAppended. children. add (childNode ) ;
             }

             return  true ;
         }
     }

     /**
     * 将节点插入为另一个节点的兄弟
     * 
     * @param sublingNode
     * @param toBeAppended
     * @return
     */

     public  static  boolean appendAsSubling ( TreeNode sublingNode,
             TreeNode toBeAppended )
     {
         if  (sublingNode  ==  null  || toBeAppended  ==  null )
         {
             return  false ;
         }  else
         {
             // 单根树,无法对根节点添加兄弟
             if  (toBeAppended. isRoot ( )  ==  true )
             {
                 return  false ;
             }  else
             {
                toBeAppended. parent. children. add (sublingNode ) ;
                 return  true ;
             }
         }
     }
}

3.TreeHelper 提供了一段简单的代码来执行创建、查找等操作

package  com.eyecm.tree ;

/**
 * 辅助工具类
 * 
 */

public  class TreeHelper
{
     int id ;

     public  int getId ( )
     {
         return id ;
     }

     public  void setId ( int id )
     {
         this. id  = id ;
     }

     public  static  void main ( String [ ] args )
     {
        NodeData root  =  new NodeData ( "root""this is root" ) ;

        NodeData n1_1  =  new NodeData ( "n1_1""level 1" ) ;
        NodeData n1_2  =  new NodeData ( "n1_2""level 1" ) ;

        NodeData n2_1  =  new NodeData ( "n2_1""level 2,n1_1 child" ) ;
        NodeData n2_2  =  new NodeData ( "n2_2""level 2,n1_1 child" ) ;
        NodeData n2_3  =  new NodeData ( "n2_3""level 2,n1_2 child" ) ;
        NodeData n2_4  =  new NodeData ( "n2_4""level 2,n1_2 child" ) ;

        NodeData n3_1  =  new NodeData ( "n3_1""level 3,n2_2 child" ) ;

         TreeNode rootNode  =  new  TreeNode ( 0nullnull, root ) ;

         TreeNode n1_1_node  =  new  TreeNode ( 1nullnull, n1_1 ) ;
         TreeNode n1_2_node  =  new  TreeNode ( 2nullnull, n1_2 ) ;
         TreeNode. appendAsChild (n1_1_node, rootNode ) ;
         TreeNode. appendAsChild (n1_2_node, rootNode ) ;

         TreeNode n2_1_node  =  new  TreeNode ( 4nullnull, n2_1 ) ;
         TreeNode n2_2_node  =  new  TreeNode ( 5nullnull, n2_2 ) ;
         TreeNode. appendAsChild (n2_1_node, n1_1_node ) ;
         TreeNode. appendAsChild (n2_2_node, n1_1_node ) ;

         TreeNode n2_3_node  =  new  TreeNode ( 6nullnull, n2_3 ) ;
         TreeNode n2_4_node  =  new  TreeNode ( 7nullnull, n2_4 ) ;
         TreeNode. appendAsChild (n2_3_node, n1_2_node ) ;
         TreeNode. appendAsChild (n2_4_node, n1_2_node ) ;

         TreeNode n3_1_node  =  new  TreeNode ( 13nullnull, n3_1 ) ;
         TreeNode. appendAsChild (n3_1_node, n2_2_node ) ;

         TreeNode. levelTraversal ( TreeNode. search ( 5, rootNode ) ) ;
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值