2016-02-04 63 views
0

我有一個類樹添加分支樹

public class Tree 
{ 
    private int tree_height; 
    private int tree_width; 
    private int nodes_count; 
    private List<Node> tree_nodes; 
} 

我想創建一個方法來一個分支添加到樹 這裏是我的代碼:

public void AddBranch(Tree branch, int node_num) 
{ 
    if (nodes_count >= node_num && node_num > 0) 
    { 
     int last_el_ordering = nodes_count, 
      first_parent_height = tree_nodes[node_num - 1].Height, 
      first_parent_ordering = tree_nodes[node_num - 1].Ordering; 
     tree_nodes.Add(new Node(branch.Tree_nodes.First().State, last_el_ordering + 1, first_parent_ordering, first_parent_height + 1)); 
     foreach (Node el in branch.Tree_nodes.Skip(1)) 
      tree_nodes.Add(new Node(el.State, el.Ordering + last_el_ordering, el.Parent + last_el_ordering, el.Height + first_parent_height)); 
     tree_nodes = tree_nodes.OrderBy(match => match.Height).ToList(); 
     int i = 1; 
     foreach (Node el in tree_nodes) 
     { 
      List<Node> temp = tree_nodes.ToList().FindAll(match => match.Parent == el.Ordering).ToList(); 
      el.Ordering = i++; 
      if (temp.Count() > 0) 
       foreach (Node el2 in temp) 
        el2.Parent = el.Ordering; 
     } 
    } 
} 

輸入

Tree testing_tree1 = new Tree(new Node("start")); 
List<string> temp = new List<string> { "a", "b", "c" }; 
foreach(string el in temp) 
    testing_tree1.AddBranch(new Tree(new Node(el)),1); 
for (int i = 0; i < 3; i++) 
    testing_tree1.AddBranch(new Tree(new Node("false")), i+2); 
Tree testing_tree2 = new Tree(new Node("d")); 
testing_tree2.AddBranch(new Tree(new Node("false")), 1); 
testing_tree1.AddBranch(testing_tree2, 1); 
testing_tree1.DisplayTree(); 
Console.Read(); 

輸出結果 輸出 樹深度: 3樹寬:4節點數:9;

  1. 節點號:1,節點父節點:-1,節點高度:1,節點值:start;
  2. 節點號:2,節點父節點:1,節點高度:2,節點值:a;
  3. 節點號:3,節點父節點:1,節點高度:2,節點值:b;
  4. 節點號:4,節點父節點:1,節點高度:2,節點值:c;
  5. 節點號:5,節點父節點:1,節點高度:2,節點值:d;
  6. 節點號:6,節點父節點:2,節點高度:3,節點值:假;
  7. 節點號:7,節點父節點:3,節點高度:3,節點值:假;
  8. 節點號:8,節點父節點:4,節點高度:3,節點值:假;
  9. 節點號:9,節點父節點:8,節點高度:3,節點值:假;

正如你可以看到最後一個節點有錯誤的父節點,任何線索?

+0

這似乎是你想在你的調試器中跟蹤的東西。 – adamdc78

+0

您發佈了什麼'DisplayTree'輸出,但不顯示'DisplayTree'的代碼。你有什麼問題? –

+2

簡單的'tree_nodes.Add(branch)'代碼看起來更復雜。請說明你真正想做的事情。 –

回答

2

在我看來,你的樹模型不太對。例如,你的Tree類沒有根,但只有孩子,這不是傳統的樹木製作方法。從你的問題來看,你的Node類是如何構建的,所以我不確定是否存在另一個問題。

這是一個非常直接的方式得到的東西接近你想要什麼,所以也許這將是一個很好的起點(免責聲明:未測試)

class Tree 
{ 
    public class Node 
    { 
     public object Value { get; set; } 
     public List<Node> Children { get; set; } 
    } 

    public Node Root { get; set; } 

    public void AddBranch(Tree tree, int add_num) 
    { 
     Root.Children.Insert(add_num, tree.Root); 
    } 
} 

編輯:上面你最近的評論,我現在理解得好一點。你的目標是創建一個Tree類,它表示它的節點與List呈線性關係。每個節點都有一個索引來指示列表中哪個節點是父節點。代碼中存在一個問題,即通過索引將項目插入到列表中。您的Tree不應該使Tree類以外的List抽象流血。對其他人來說,你的樹是一棵樹,而不是一個列表。當你添加你的分支時,你需要確定你想要添加它的規則。作爲一片葉子?作爲根和添加現有的節點作爲孩子?目前還不清楚在插入新節點時你的規則是什麼。

現在解決您的代碼中的錯誤,除了您的(imo可疑)模型。通過將您的(假設爲N)節點添加到節點列表中的索引處,可以取代節點列表中對象的所有索引。如果您在索引5處插入,則索引處的節點爲5,6,7,8 ...移至索引5+N,6+N,7+N,8+N ...並且您需要解決以下情況。

  • 是否有任何節點對插入索引處或上方的父節點有引用?如果是這樣,那麼在這些節點中的每一箇中,通過N增加其父節點的索引。
  • 在我的每個插入節點中,將其父節點的索引增加5(或node_num),將其傳遞到您的AddBranch方法中。

至於你的代碼處理tree_heighttree_width休息...我不知道是否有任何的錯誤,沒有看到你的Node類。

+0

我的'Tree'類有List Tree_nodes,它包含0的根和該屬性爲parent = 1的根的子節點;等等。 'public class Node {private object state; private int排序; private int height; private int parent;}' –

+0

啊,所以你試圖用一個類似數組的結構來表示樹?你的'AddBranch()'方法中'node_num'指示了什麼? - **儘管有了這些答案,但我建議重新啓動您的代碼以遵循更傳統的樹**模型。這只是更容易理解和遵循。簡單=減少錯誤 –

+0

node_num是我想要附加分支的節點的數量(1爲root) 我會嘗試重寫樹類...雖然我也有了decision_tree類,但我希望它不會超過以上我的能力。 請你能給我想法創建顯示樹的遞歸版本嗎? (節點和值的數量,節點的高度和樹中的父節點的數量) –