向树添加分支
本文关键字:分支 添加 | 更新日期: 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,节点值:开始; 节点数:2,节点父节点:1,节点
- 高度:2,节点值:a; 节点数:3,节点父节点:1,节点
- 高度:2,节点值:b; 节点数:4,节点父节点:1,节点
- 高度:2,节点值:c; 节点数:5,节点父节点:1,节点
- 高度:2,节点值:d; 节点数:6,节点父节点:2,节点
- 高度:3,节点值:假; 节点数:7,节点父节点:3,节点
- 高度:3,节点值:假; 节点数:8,节点父节点:4,节点
- 高度:3,节点值:假; 节点数:9,节点父节点:8,节点
- 高度: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 处插入,则索引 5
、 6
、 7
、 8
...移至指数 5+N
, 6+N
, 7+N
, 8+N
...您需要解决以下情况。
- 是否有任何节点引用了位于或高于插入索引的父节点? 如果是这样,则在每个节点中,将其父节点的索引增加
N
。 - 在我插入的每个节点中,将其父节点的索引增加
5
(或node_num
(传递给AddBranch
方法。
至于处理tree_height
和tree_width
的其余代码......我不确定在没有看到您的Node
类的情况下是否有任何错误。