gpt4 book ai didi

c# - 向树添加分支

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:56:28 25 4
gpt4 key购买 nike

我有一个类树

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;

As you can see the last node has wrong parent, any clue?

最佳答案

在我看来,您的树模型不太正确。例如,您的 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< 的情况下是否存在任何错误 类。

关于c# - 向树添加分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35209824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com