向树添加分支

本文关键字:分支 添加 | 更新日期: 2023-09-27 18:33:26

我有一个类树

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,节点值:开始;
  2. 节点数:2,节点父节点:1,节点
  3. 高度:2,节点值:a;
  4. 节点数:3,节点父节点:1,节点
  5. 高度:2,节点值:b;
  6. 节点数:4,节点父节点:1,节点
  7. 高度:2,节点值:c;
  8. 节点数:5,节点父节点:1,节点
  9. 高度:2,节点值:d;
  10. 节点数:6,节点父节点:2,节点
  11. 高度:3,节点值:假;
  12. 节点数:7,节点父节点:3,节点
  13. 高度:3,节点值:假;
  14. 节点数:8,节点父节点:4,节点
  15. 高度:3,节点值:假;
  16. 节点数:9,节点父节点:8,节点
  17. 高度:3,节点值:假;

如您所见,最后一个节点的父节点错误,有什么线索吗?

向树添加分支

在我看来,你的树模型不太正确。 例如,你的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 处插入,则索引 5678 ...移至指数 5+N6+N7+N8+N ...您需要解决以下情况。

  • 是否有任何节点引用了位于或高于插入索引的父节点? 如果是这样,则在每个节点中,将其父节点的索引增加 N
  • 在我插入的每个节点中,将其父节点的索引增加5(或node_num(传递给AddBranch方法。

至于处理tree_heighttree_width的其余代码......我不确定在没有看到您的Node类的情况下是否有任何错误。