java 动态数据结构,如何在Java中创建动态树数据结构

具体而言,我需要表示以下内容:

任何节点上的树都可以有任意数量的子节点

每个父节点(在根之后)只是一个字符串(其子节点也是字符串)

我需要能够获取父节点并列出所有子节点(某些列表或字符串数​​组),并给出表示给定节点的输入字符串

根据父和子之间的引用关系动态填充树结构。 给出的例子是我有一个member1赞助另一个member2,member2赞助成员3等等。 已经有表格记录关系

有没有可用的结构?

我的数据来自数据库或列表,我将通过名称和关系循环查看信息,以确定节点是根,父母还是孩子。

因此,在循环中,我找到了一个孩子,我需要对父代的引用,以便在将子代添加到其父代之前,可以将其与父代进行比较。

我找到的最接近的代码。public class TreeNode implements Iterable> {

T data;

TreeNode parent;

List> children;

public TreeNode(T data) {

this.data = data;

this.children = new LinkedList>();

}

public TreeNode addChild(T child) {

TreeNode childNode = new TreeNode(child);

childNode.parent = this;

this.children.add(childNode);

return childNode;

}

// other features ...

}

Sample usage:

TreeNode root = new TreeNode("root");

{

TreeNode node0 = root.addChild("node0");

TreeNode node1 = root.addChild("node1");

TreeNode node2 = root.addChild("node2");

{

TreeNode node20 = node2.addChild(null);

TreeNode node21 = node2.addChild("node21");

{

TreeNode node210 = node20.addChild("node210");

}

}

}

这是我迄今为止所做的。 父母将被最新的条目覆盖,所以我无法检索我以前添加的内容。public static TreeNode 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(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>();

对于每个人,都将它们存储在地图中,并按其名称进行索引:TreeNode person=...;

processedPersonsMap.put(person.getData(), person);

当你读到一个新的人,他们的父母的名字不是破折号,你看父母:String parentName=items[1];

TreeNode parent=processedPersonsMap.get(parentName);

这样,无论树有多深,你总能找到合适的父母。 但是请记住,这需要一个有效的输入文件,其中每个孩子都在父母之后,并且不包含循环引用或缺少父母。

如果不符合这些条件,则必须明确处理它们。

链接地址: http://www.djcxy.com/p/39877.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值