public class Tree<T> {
private Node<T> root;
public Tree(T rootData) {
root = new Node<T>();
root.data = rootData;
root.children = new ArrayList<Node<T>>();
}
public static class Node<T> {
private T data;
private Node<T> parent;
private List<Node<T>> children;
}
}
这是一个基本的树结构,可以用于 String 或任何其他物体。实现简单的树来做您需要的事情是相当容易的。 您只需要添加add to、removing from、遍历和构造函数的方法。这个 Node 是 Tree .
/***
/* Within the class that's using a binary tree for any reason. You could
/* generalize with generics IFF the parent class needs different value types.
*/
private class Node {
public String value;
public Node[] nodes; // Or an Iterable<Node> nodes;
}
对于任意宽度的树来说就是这样。 如果您想要一个二叉树,它通常更容易与命名字段一起使用:
private class Node { // Using package visibility is an option
String value;
Node left;
Node right;
}
或者如果你想试试看:
private class Node {
String value;
Map<char, Node> nodes;
}
import java.util.HashMap;
import java.util.LinkedList;
public class TreeMap<T> extends LinkedHashMap<T, TreeMap<T>> {
public void put(T[] path) {
LinkedList<T> list = new LinkedList<>();
for (T key : path) {
list.add(key);
}
return put(list);
}
public void put(LinkedList<T> path) {
if (path.isEmpty()) {
return;
}
T key = path.removeFirst();
TreeMap<T> val = get(key);
if (val == null) {
val = new TreeMap<>();
put(key, val);
}
val.put(path);
}
}
按照gareth的回答,检查defaultmutabletreenode。它不是通用的,但在其他方面似乎符合要求。即使它在javax.swing包中,也不依赖于任何awt或swing类。事实上,源代码实际上有注解 // ISSUE: this class depends on nothing in AWT -- move to java.util?
24条答案
按热度按时间dbf7pr2w1#
在这里:
这是一个基本的树结构,可以用于
String
或任何其他物体。实现简单的树来做您需要的事情是相当容易的。您只需要添加add to、removing from、遍历和构造函数的方法。这个
Node
是Tree
.i7uq4tfw2#
您可以使用apachejmeter中包含的hashtree类,它是jakarta项目的一部分。
hashtree类包含在org.apache.jorphan.collections包中。尽管这个包不是在jmeter项目之外发布的,但是您可以很容易地获得它:
1) 下载jmeter源代码。
2) 创建新包。
3) 复制到/src/jorphan/org/apache/jorphan/collections/。除data.java以外的所有文件
4) 同时复制/src/jorphan/org/apache/jorphan/util/jorphanutils.java
5) hashtree已经可以使用了。
zfycwa2u3#
如果你正在做白板编码,面试,甚至只是计划使用一棵树,这些冗长的都是有点多。
应该进一步说,一棵树不在那里的原因,比如说,一棵树
Pair
(也可以这么说),因为您应该使用它将数据封装在类中,最简单的实现如下所示:对于任意宽度的树来说就是这样。
如果您想要一个二叉树,它通常更容易与命名字段一起使用:
或者如果你想试试看:
现在你说你想要
如果给定一个表示给定节点的输入字符串,则能够获取所有子级(某种类型的字符串列表或数组)
听起来像你的作业。
但既然我有理由肯定任何最后期限都已经过去了…
这样你就可以使用:
41zrol4v4#
我基于“hashmap”编写了一个小的“treemap”类,它支持添加路径:
它可以用来存储类型为“t”(泛型)的树,但不支持在节点中存储额外的数据。如果您有这样的文件:
然后可以通过执行以下命令将其变为树:
你会得到一棵漂亮的树。它应该很容易适应你的需要。
5m1hhzi45#
请检查下面的代码,我使用了树数据结构,没有使用集合类。该代码可能有错误/改进,但请使用此仅供参考
2guxujil6#
我编写了一个树库,可以很好地使用java8,并且没有其他依赖项。它还提供了对函数式编程的一些想法的松散解释,并允许您Map/过滤/修剪/搜索整个树或子树。
https://github.com/rutledgepaulv/prune
这个实现在索引方面没有做任何特殊的工作,我也没有偏离递归,因此,使用大型树时,性能可能会下降,可能会破坏堆栈。但如果你只需要一个简单的树,从小到中等的深度,我认为它已经足够好用了。它提供了一个合理的(基于值的)平等定义,还提供了一个tostring实现,可以让您可视化树!
2sbarzqh7#
按照gareth的回答,检查defaultmutabletreenode。它不是通用的,但在其他方面似乎符合要求。即使它在javax.swing包中,也不依赖于任何awt或swing类。事实上,源代码实际上有注解
// ISSUE: this class depends on nothing in AWT -- move to java.util?
oug3syen8#
我写了一个处理泛型树的小库。它比秋千轻得多。我还有一个maven项目。
zpgglvta9#
没有答案提到过简化但有效的代码,所以这里是:
hzbexzde10#
在过去,我只是使用了一个嵌套的Map。这是我今天用的,它很简单,但它适合我的需要。也许这会帮助另一个。
mnowg1ta11#
这个怎么样?
b09cbbtk12#
您应该从定义树(对于域)开始,最好先定义接口。并不是所有的树结构都是可修改的,能够添加和删除节点应该是一个可选的特性,所以我们为它创建了一个额外的接口。
不需要创建包含这些值的节点对象,事实上,我认为这是大多数树实现中的一个主要设计缺陷和开销。如果你看看秋千
TreeModel
没有节点类(仅限于DefaultTreeModel
利用TreeNode
),因为它们不是真正需要的。可变树结构(允许添加和删除节点):
给定这些接口,使用树的代码不必太关心树的实现方式。这允许您使用泛型实现和专用实现,通过将函数委托给另一个api来实现树。
示例:文件树结构
示例:通用树结构(基于父/子关系):
q5lcpyga13#
另一种树结构:
示例用法:
奖金
见成熟的树木:
迭代器
搜索
java/c语言#
https://github.com/gt4dev/yet-another-tree-structure
moiiocjp14#
实际上,jdk中实现了一个非常好的树结构。
看看javax.swing.tree、treemodel和treenode。它们设计用于
JTreePanel
但事实上,它们是一个非常好的树实现,没有什么可以阻止您在没有swing接口的情况下使用它。请注意,从Java9开始,您可能不希望使用这些类,因为它们不会出现在“compactprofiles”中。
lvjbypge15#
您可以使用java的任何XMLAPI作为文档和节点,因为xml是带有字符串的树结构