Java中的通用树实现

有没有人知道Java的通用树(节点可能有多个孩子)的实现? 它应该来自一个值得信赖的来源,必须经过充分的testing。

这似乎不是自己实现它。 几乎让我想起我大学的时候,我们应该自己写所有的藏品。

编辑:在java.net上find这个项目 ,可能值得研究。

它来了:

abstract class TreeNode implements Iterable<TreeNode> { private Set<TreeNode> children; public TreeNode() { children = new HashSet<TreeNode>(); } public boolean addChild(TreeNode n) { return children.add(n); } public boolean removeChild(TreeNode n) { return children.remove(n); } public Iterator<TreeNode> iterator() { return children.iterator(); } } 

我非常信任,但还没有testing实施。

Collections库中没有Tree类。 但是,Swing框架中有一个。 DefaultTreeModel的

我过去曾经使用过,效果很好。 它确实吸引了额外的类到你的应用程序,虽然可能或不可取。

您也可以使用另一个集合来模拟Tree,并在其中存储集合。 例如。 列表的列表。

使用番石榴

Guava 15.0为树遍历引入了一个很好的API,所以你不需要为代码库中的gazillionth时间重新实现它。

也就是说, TreeTraverser和一些专门的实现,如BinaryTreeTraverser

一个非常受欢迎的补充,以避免重新实施这么简单,并与额外的奖金:

  • 安心(稳定,支持图书馆等)
  • 好的devise,
  • 内置几种遍历模式。

当你在那里…

请注意,Guava现在还提供了新的方法来使用TreeTraverser ,例如Files.fileTreeTraverser() ,它为您的文件系统遍历需求提供了一个TreeTraverser<File>

在Java中实现一个真正的通用树实现是相当困难的,它将树操作和属性从底层实现中分离出来,即交换一个RedBlackTreeNode并重写一些方法来获得一个RedBlackTree实现,同时保留一个BinaryTree界面包含。

而且,理想的抽象将能够将低级树表示,例如存储在数组中的隐式二叉树结构replace为具有左和右子指针或多个子指针的Heap或节点基接口,或者用父指针或者叶节点等等来增加上面的任何一个。

我自己尝试和解决了这个问题,但最终还是有一个相当复杂的界面,仍然强化了types安全。 这是构思一个抽象的BinaryTree类的一个非平凡的操作(Euler Tour)的框架,即使底层节点类或树类改变了,它也能工作。 通过在树结构中引入用于导航和位置的游标的概念,可能可以改进:

 public interface Tree<E, P extends Tree.Entry<E, P>> extends Collection<E> { public P getRoot(); public Collection<P> children(P v); public E getValue(P v); public static interface Entry<T, Q extends Entry<T, Q>> { } } public interface BinaryTree<E, P extends BinaryTree.Entry<E, P>> extends Tree<E, P> { public P leftChild(P v); public P rightChild(P v); public static interface Entry<T, Q extends Entry<T, Q>> extends Tree.Entry<T, Q> { public Q getLeft(); public Q getRight(); } } public interface TreeTraversalVisitor<E, P extends BinaryTree.Entry<E, P>, R> { public R visitLeft( BinaryTree<E, P> tree, P v, R result ); public R visitCenter( BinaryTree<E, P> tree, P v, R result ); public R visitRight( BinaryTree<E, P> tree, P v, R result ); } public abstract class AbstractBinaryTree<E, P extends BinaryTree.Entry<E, P>> extends AbstractCollection<E> implements BinaryTree<E, P> { public Collection<P> children( P v ) { Collection<P> c = new ArrayList<P>( 2 ); if ( hasLeft( v )) c.add( v.getLeft()); if ( hasRight( v )) c.add( v.getRight()); return c; } /** * Performs an Euler Tour of the binary tree */ public static <R, E, P extends BinaryTree.Entry<E, P>> R eulerTour( BinaryTree<E, P> tree, P v, TreeTraversalVisitor<E, P, R> visitor, R result ) { if ( v == null ) return result; result = visitor.visitLeft( tree, v, result ); if ( tree.hasLeft( v )) result = eulerTour( tree, tree.leftChild( v ), visitor, result ); result = visitor.visitCenter( tree, v, result ); if ( tree.hasRight( v )) result = eulerTour( tree, tree.rightChild( v ), visitor, result ); result = visitor.visitRight( tree, v, result ); return result; } } 

嗯,我会发一个无耻的插件到我的解决scheme,看到有人已经发布了一个链接。 是的,我有同样的问题,我基本上结束了写我自己的通用树。 我已经testing了树节点和树本身。

我将该节点实现为具有数据字段和节点列表(该节点的子节点)的对象。

http://vivin.net/2010/01/30/generic-n-ary-tree-in-java/

我在这里find了一个通用树(带有testing)的实现:

http://vivin.net/2010/01/30/generic-n-ary-tree-in-java/

我想这就是你要找的。

我find了一个非常棒的库http://jung.sourceforge.net ,参见javadoc http://jung.sourceforge.net/doc/api/index.html 。 这不仅仅是一个graphics实现。 有了它,你可以可视化和布局graphics; 此外,它还有一些标准的graphicsalgorithm,您可以直接使用。 去吧,看看吧! 虽然我最终实现了自己的基本graphics(之前我不知道JUNG),但是我使用这个库进行可视化。 它看起来非常整齐!

我使用XML DOM(XML描述树形结构),特别是开源XOM( http://www.xom.nu )。 这是轻量级的,如果需要的话,节点可以被分类,并且被高度使用和testing。 它可能比你需要的大,但它的优点是任何树的导航方法(祖先,兄弟姐妹等)都通过XPath完全pipe理。 您也可以序列化树并通过testing的XML方法进行转换。 还有一个强大的用户社区