2010-11-11 23 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