您可以使用一个仅具有下一指针和子指针的节点类型来表示多路树。
该节点的“next”指针用于指向下一个兄弟子节点,实现为简单的链表。
该节点的“child”指针用于指向节点的第一个子节点。
以下是演示如何组合这些内容的示例代码。它不包含任何错误处理,并且不打算成为完整的解决方案,但您应该能够编译它并在必要时在调试器下运行它以充分理解其工作原理。
我还添加了一个可枚举的示例,以展示如何迭代树节点。您可能需要尝试不同的操作以按不同顺序生成结果。如果使用可枚举对象过于复杂,则需要编写自己的简单递归方法来访问所有节点。
请注意,此示例中的节点类型是通用的,我仅使用它来保存字符串数据。如果您不想要通用类型,则可以将T替换为所需的类型。
using System;
using System.Collections;
using System.Collections.Generic;
namespace Demo
{
sealed class Node<T>
{
public T Data;
public Node<T> Next;
public Node<T> Child;
}
sealed class Tree<T>: IEnumerable<T>
{
public Node<T> Root;
public Node<T> AddChild(Node<T> parent, T data)
{
parent.Child = new Node<T>
{
Data = data,
Next = parent.Child
};
return parent.Child;
}
public IEnumerator<T> GetEnumerator()
{
return enumerate(Root).GetEnumerator();
}
private IEnumerable<T> enumerate(Node<T> root)
{
for (var node = root; node != null; node = node.Next)
{
yield return node.Data;
foreach (var data in enumerate(node.Child))
yield return data;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
class Program
{
void run()
{
var tree = new Tree<string>();
tree.Root = new Node<string>{Data = "Root"};
var l1n3 = tree.AddChild(tree.Root, "L1 N3");
var l1n2 = tree.AddChild(tree.Root, "L1 N2");
var l1n1 = tree.AddChild(tree.Root, "L1 N1");
tree.AddChild(l1n1, "L2 N1 C3");
tree.AddChild(l1n1, "L2 N1 C2");
var l2n1 = tree.AddChild(l1n1, "L2 N1 C1");
tree.AddChild(l1n2, "L2 N2 C3");
tree.AddChild(l1n2, "L2 N2 C2");
tree.AddChild(l1n2, "L2 N2 C1");
tree.AddChild(l1n3, "L2 N3 C3");
tree.AddChild(l1n3, "L2 N3 C2");
tree.AddChild(l1n3, "L2 N3 C1");
tree.AddChild(l2n1, "L3 N1 C3");
tree.AddChild(l2n1, "L3 N1 C2");
tree.AddChild(l2n1, "L3 N1 C1");
tree.Print();
}
static void Main()
{
new Program().run();
}
}
static class DemoUtil
{
public static void Print(this object self)
{
Console.WriteLine(self);
}
public static void Print(this string self)
{
Console.WriteLine(self);
}
public static void Print<T>(this IEnumerable<T> self)
{
foreach (var item in self)
Console.WriteLine(item);
}
}
}
我知道这与Eric上面的答案相似,如果在写这篇文章之前我读了那个答案,我可能就不会费心写这篇了 - 但我已经写好了,不想把它扔掉。
System
_”的限制需要解释。另外,需要哪些操作?需要在任意位置插入、删除吗? - H H