如何在Java中创建动态树数据结构
具体而言,我需要表示以下内容:
有没有可用的结构?
我的数据来自数据库或列表,我将通过名称和关系循环查看信息,以确定节点是根,父母还是孩子。
因此,在循环中,我找到了一个孩子,我需要对父代的引用,以便在将子代添加到其父代之前,可以将其与父代进行比较。
我找到的最接近的代码。
public class TreeNode<T> implements Iterable<TreeNode<T>> {
T data;
TreeNode<T> parent;
List<TreeNode<T>> children;
public TreeNode(T data) {
this.data = data;
this.children = new LinkedList<TreeNode<T>>();
}
public TreeNode<T> addChild(T child) {
TreeNode<T> childNode = new TreeNode<T>(child);
childNode.parent = this;
this.children.add(childNode);
return childNode;
}
// other features ...
}
Sample usage:
TreeNode<String> root = new TreeNode<String>("root");
{
TreeNode<String> node0 = root.addChild("node0");
TreeNode<String> node1 = root.addChild("node1");
TreeNode<String> node2 = root.addChild("node2");
{
TreeNode<String> node20 = node2.addChild(null);
TreeNode<String> node21 = node2.addChild("node21");
{
TreeNode<String> node210 = node20.addChild("node210");
}
}
}
这是我迄今为止所做的。 父母将被最新的条目覆盖,所以我无法检索我以前添加的内容。
public static TreeNode<String> getSet1() throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
String line;
while ((line = reader.readLine()) != null) {
String[] items = line.split(":");
String name = items[0];
String parent = items[1];
String type = items[2];
if (parent.equalsIgnoreCase("-") && type.equalsIgnoreCase("mainparent")) {
root = new TreeNode<String>(name);
} else if (type.equalsIgnoreCase("ChildParent") && parent.equalsIgnoreCase(root.toString())) {
childParent = root.addChild(name);
} else if (type.equalsIgnoreCase("Child") && parent.equalsIgnoreCase(childParent.toString())) {
child = childParent.addChild(name);
}
}
return root;
}
你的图表显示了一个任意深度的树,但是你的代码只处理祖父母 - >父 - 子关系(在一个祖父母的根上)。
我会忽略这个类型,因为所有你需要的是一个人的名字和他们父母的名字。 如果父母的名字是短划线,那么你知道你有根。
现在对于每个人,您需要在树中已经获得父节点(假设父母在列表中的孩子之前) - 如果情况并非如此,则问题变得更为复杂,因为您必须临时存储孤儿,每个新人看他们是否是孤儿的父母)。
为了通过名称获取父项,应该将已经处理的每个人存储在第二个数据结构中,并行于该树。 第二个数据结构应该可以很容易地按名称查看某个人。 地图,特别是哈希表,对此非常理想。 这是如何工作的:
Map processedPersonsMap=new Hashtable<String, TreeNode<String>>();
对于每个人,都将它们存储在地图中,并按其名称进行索引:
TreeNode<String> person=...;
processedPersonsMap.put(person.getData(), person);
当你读到一个新的人,他们的父母的名字不是破折号,你看父母:
String parentName=items[1];
TreeNode<String> parent=processedPersonsMap.get(parentName);
这样,无论树有多深,你总能找到合适的父母。 但是请记住,这需要一个有效的输入文件,其中每个孩子都在父母之后,并且不包含循环引用或缺少父母。
如果不符合这些条件,则必须明确处理它们。
链接地址: http://www.djcxy.com/p/39877.html