2010-11-11 54 views
0

我有一个数据结构,看起来像这样解析节点在字符串中的矢量一个Java树结构

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

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

别处在我的计划,我有一个节点称为一个包含整个树数据结构的“根” 。

概念上,它看起来像这样

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

正如你所看到的节点可以有相同的名字。这是打算。我想为包含自己名字的每个节点创建一个字符串,并将其添加到沿袭中,并将它们存储在Vector中。

等的左手侧节点3将是"root|node1|node2|node3"上RHS上的节点3将"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); 
      } 
     } 
    } 

谢谢你们。

回答

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()); 
    } 
} 

注:我没能在发布前测试此代码。

+0

我不是在寻找打印了新的途径。我想为每个节点添加父母。 – larjudge 2010-11-11 14:10:22

+0

对不起。我编辑了我的答案以适应这个问题。 – CVAUGHN 2010-11-11 14:24:15

0

我假设你已经创建了这些节点,并且它们是用子节点创建的,但没有父节点?好像有几个选项:

  1. 当创建一个孩子,设置父(我想你真的没有控制这一点,因为你问这个问题),所以...
  2. 相反一个Vector可能使用某种类型的Map,您可以将该Key设置为谱系。然后当你迭代节点时,做一些字符串调整来删除当前节点的名字,并且你留下了父系。
  3. 与#2相关,不要使用Map(并保留Vector)并仍然执行字符串操作,但是您必须迭代Vector中的每个节点才能通过它的血统查找父级。

希望这有助于,希望我假设正确 -Dave

+0

当我创建一个孩子时,由于我首先获取信息,我无法创建父级。我会覆盖对象。 (还是)感谢你的建议。 – larjudge 2010-11-11 14:16:36

+0

是的,想通了。我会说你唯一的选择是解析字符串,孩子必须删除“| noneX”,那么你有父母的路径。在那里,你可以搜索与匹配解析字符串的父对象的Vector,或者如前所述使用Map并查找它。一种黑客,但我不知道你有什么其他选择... – Merky 2010-11-11 15:38:34