我有一个班级树
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;
正如您所看到的,最后一个节点有错误的父节点,有任何线索吗?
答案 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处插入,则索引为5
,6
,7
,8
的节点...移至索引5+N
,{{1} },6+N
,7+N
...您需要解决以下问题。
8+N
增加其父级的索引。N
方法传递5
(或node_num
)来增加其父节点的索引。至于处理AddBranch
和tree_height
的其他代码...我不确定是否有任何错误而没有看到您的tree_width
类。