Bạn có thể đại diện cho cây đa chiều bằng cách sử dụng loại nút chỉ có con trỏ tiếp theo và con trỏ con.
Nút của con trỏ next
được sử dụng để trỏ đến đứa con anh chị em tiếp theo, được triển khai dưới dạng danh sách được liên kết đơn giản.
Nút của con trỏ child
được sử dụng để trỏ đến con đầu tiên của nút.
Dưới đây là một số mã mẫu minh họa cách đặt cùng nhau. Nó không chứa bất kỳ xử lý lỗi nào và nó không phải là một giải pháp hoàn chỉnh, nhưng bạn có thể biên dịch nó và - nếu cần - hãy chạy nó dưới trình gỡ rối để hiểu đầy đủ cách nó hoạt động.
Tôi cũng đã thêm một ví dụ liệt kê để cho biết cách bạn có thể lặp qua các nút cây. Bạn có thể sẽ muốn chơi xung quanh với điều này để tạo ra kết quả theo các đơn đặt hàng khác nhau. NẾU sử dụng một số đếm là quá phức tạp cho những gì bạn cần, bạn sẽ cần phải viết phương pháp recusive đơn giản của riêng bạn để truy cập tất cả các nút.
Lưu ý rằng loại nút là chung trong ví dụ này và tôi chỉ sử dụng nó để giữ dữ liệu chuỗi. Bạn chỉ có thể thay thế T
bằng loại bạn muốn nếu bạn không muốn loại chung.
using System;
using System.Collections;
using System.Collections.Generic;
namespace Demo
{
sealed class Node<T>
{
public T Data; // Payload.
public Node<T> Next; // This will point to the next sibling node (if any), forming a linked-list.
public Node<T> Child; // This will point to the first child node (if any).
}
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 // Prepare to place the new node at the head of the linked-list of children.
};
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);
}
}
}
(Tôi biết điều này cũng tương tự như câu trả lời của Eric trên, và nếu tôi muốn đọc câu trả lời trước khi viết này tôi có lẽ sẽ không làm phiền - nhưng tôi muốn đã viết này và tôi đã không chỉ muốn vứt bỏ nó đi.)
Tại sao không sử dụng Danh sách trẻ em thay vì Node? –
Jerska
Tôi không thể sử dụng bất kỳ lớp Bộ sưu tập nào. Tôi chỉ có thể sử dụng Hệ thống để thực hiện điều này. –
'Tôi không thể sử dụng bất kỳ lớp sưu tập nào' tại sao lại như vậy? Đây có phải là bài tập về nhà hoặc phỏng vấn không? –