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