2016-02-04 66 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类,但我希望它不会超过以上我的能力。 请你能给我想法创建显示树的递归版本吗? (节点和值的数量,节点的高度和树中的父节点的数量) –