在字符串向量中解析Java树结构中的节点

时间:2010-11-11 13:40:02

标签: java data-structures tree

我有一个看起来像这样的数据结构

private String name;
private ArrayList<Node> children;
private String parent="";

public Node(String name) {
setName(name);
children = new ArrayList<Node>();
}

在我的程序的其他地方,我有一个名为“root”的节点,它包含整个树数据结构。

概念上看起来像这样

                                       root
                                      /     \
                                     /       \
                                  node1     node2
                                   /           \
                                  /             \
                                node2          node3
                                / 
                               /
                             node3

如您所见,节点可以具有相同的名称。这是有意的。我想为每个包含自己名称的节点创建一个字符串,加上它的沿袭并将它们存储在Vector中。

因此左侧的节点3将是"root|node1|node2|node3" rhs上的node3将是"root|node2|node3" node1将是"root|node1"等。

我有办法遍历节点结构来打印每个节点,但我发现很难设置每个父节点,因为我无法找到一种方法。任何帮助都会很棒,因为到目前为止我所尝试的一切都失败了。一个重要的注意事项是树可能不一定是二叉树,我只是用它作为一个例子。

这是我用来打印树的每个节点的代码。希望很容易调整。

public void print() {
        LinkedList<Node> open = new LinkedList<Node>();
        LinkedList<Node> closed = new LinkedList<Node>();

        open.add(this);

        while(!open.isEmpty()) {
            Node currentNode = open.removeFirst();
            System.out.println(currentNode.getName());

            ArrayList<Node> children = currentNode.getChildren();
            closed.add(currentNode);

            for(int i = 0; i < children.size(); i++) {
                Node current = children.get(i);
                open.addLast(current);
            }
        }
    }

谢谢你们。

2 个答案:

答案 0 :(得分:0)

在构建树时似乎更容易添加父级,但如果构建了树并希望向每个节点添加父级,则可以使用递归。 我会尝试像

这样的东西
addParent(root, "");

public void addParent(Node node, String parent) {
  node.setParent(parent);

  // if this node has children iterate through them
  // and call addParent with current node name.
  for(Node childNode : node.getChildren()) {
        addParent(childNode, node.getName());
  }
}

注意:我在发布之前无法测试此代码。

答案 1 :(得分:0)

我假设您已经创建了这些节点并且它们是使用子节点但没有父节点创建的?似乎有几个选择:

  1. 在创建孩子时,设置父母(我认为你实际上无法控制这个,因为你问这个问题)所以...
  2. 而不是Vector可以使用某种类型的Map,您可以将键设置为谱系。然后,当您遍历节点时,执行一些字符串调整以删除当前节点的名称,并留下父谱系。
  3. 与#2相关,不要使用Map(并保留Vector)并仍然进行字符串操作,但是你必须迭代Vector中的每个节点,以便按其谱系查找父节点。
  4. 希望这有所帮助,希望我能正确地假设 -Dave