Tree
Tree用のデータ構造を作ってみた。2時間ほどで作ったので、たたき台程度。
using System; using System.Collections; using System.Collections.Generic; namespace CSTest { /// <summary>ペア</summary> public struct Pair<T, U> { /// <summary>要素1</summary> public T First; /// <summary>要素2</summary> public U Second; /// <summary>コンストラクタ</summary> public Pair(T t) { First = t; Second = default(U); } /// <summary>コンストラクタ</summary> public Pair(T t, U u) { First = t; Second = u; } /// <summary>等値演算</summary> public override bool Equals(object obj) { Pair<T, U> pr = (Pair<T, U>)obj; return First.Equals(pr.First) && Second.Equals(pr.Second); } /// <summary>ハッシュコード</summary> public override int GetHashCode() { return First.GetHashCode() ^ Second.GetHashCode(); } /// <summary>文字列化</summary> public override string ToString() { return First.ToString() + ", " + Second.ToString(); } } /// <summary>Treeの要素</summary> public class TreeNode<T> { /// <summary>値</summary> public T Value; internal LinkedList<TreeNode<T>> _Nodes; /// <summary>子要素</summary> public LinkedList<TreeNode<T>> Nodes { get { return _Nodes; } } /// <summary>先頭</summary> public LinkedListNode<TreeNode<T>> First { get { return _Nodes.First; } } /// <summary>最後</summary> public LinkedListNode<TreeNode<T>> Last { get { return _Nodes.Last; } } /// <summary>子要素の数</summary> public int Count { get { return _Nodes.Count; } } /// <summary>コンストラクタ</summary> public TreeNode() : this(default(T)) { } /// <summary>コンストラクタ</summary> public TreeNode(T t) { Value = t; _Nodes = new LinkedList<TreeNode<T>>(); } } /// <summary>Tree</summary> public class Tree<T> : IEnumerable { private TreeNode<T> _Root; /// <summary>根</summary> public TreeNode<T> Root { get { return _Root; } } /// <summary>コンストラクタ</summary> public Tree() { _Root = new TreeNode<T>(); } /// <summary>コンストラクタ</summary> public Tree(T t) { _Root = new TreeNode<T>(t); } /// <summary>追加</summary> public void Add(T t) { _Root._Nodes.AddLast(new TreeNode<T>(t)); } /// <summary>追加</summary> public void Add(LinkedListNode<TreeNode<T>> ln, T t) { ln.Value._Nodes.AddLast(new TreeNode<T>(t)); } /// <summary>削除</summary> public void Remove(LinkedListNode<TreeNode<T>> ln) { ln.List.Remove(ln); } internal IEnumerator GetEnumerator(int level, TreeNode<T> tn) { yield return new Pair<int, T>(level, tn.Value); LinkedListNode<TreeNode<T>> ln = tn.Nodes.First; while (ln != null) { IEnumerator en = GetEnumerator(level + 1, ln.Value); while (en.MoveNext()) yield return (Pair<int, T>)en.Current; ln = ln.Next; } } /// <summary>反復子</summary> public IEnumerator GetEnumerator() { return GetEnumerator(0, _Root); } } class Program { static void Main(string[] args) { Tree<int> t = new Tree<int>(123); t.Add(234); t.Add(t.Root.First, 345); t.Add(456); foreach (Pair<int, int> pr in t) // pr = (レベル, 値) { string s = pr.Second.ToString(); Console.WriteLine(s.PadLeft((pr.First + 1) * 4)); } // 出力 // 123 // 234 // 345 // 456 } } }
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27341&forum=7&1