将分支添加到树中

时间:2016-02-04 19:25:55

标签: c# algorithm

我有一个班级树

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,节点值:false;
  7. 节点编号:7,节点父节点:3,节点高度:3,节点值:false;
  8. 节点号:8,节点父节点:4,节点高度:3,节点值:false;
  9. 节点号:9,节点父节点:8,节点高度:3,节点值:false;
  10.   

    正如您所看到的,最后一个节点有错误的父节点,有任何线索吗?

1 个答案:

答案 0 :(得分: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不应该导致List类之外的Tree抽象。对于其他人来说,你的树是树,而不是列表。添加分支时,需要确定添加分支的规则。作为一片叶子?作为根并将现有节点添加为子节点?在插入新节点时,您的规则不清楚。

现在除了你的(imo questionable)模型之外,还要解决代码中的错误。通过在索引中添加您的(请说N)节点到节点列表中,可以替换节点列表中对象的所有索引。如果您在索引5处插入,则索引为5678的节点...移至索引5+N,{{1} },6+N7+N ...您需要解决以下问题。

  • 是否有任何节点在插入索引处或之上有对父节点的引用?如果是这样,则在每个节点中,通过8+N增加其父级的索引。
  • 在我插入的每个节点中,按N方法传递5(或node_num)来增加其父节点的索引。

至于处理AddBranchtree_height的其他代码...我不确定是否有任何错误而没有看到您的tree_width类。