树 原设计:http://stackoverflow.com/questions/66893/tree-data-structure-in-c-sharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace test
{
class test
{
public static void Main(String[] args)
{
try
{
//NTree<int> parent = numbers;
foreach(int num in Enumerable.Range(1, 10))
{
foreach (int i in GetNumber(num))
{
Console.WriteLine(i + " ");
}
Console.WriteLine();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
public static IEnumerable GetNumber(int pnum)
{
NTree<int> parent = new NTree<int>(pnum);
//后序遍历树
NTree<int> child = null;
#region 自下而上 后序遍历
while (true)
{
int value = parent.Data;
#region 判断底层是否可以产生 新的
List<int> list = null;
try
{
list = Power(value);
if (value < 5)
{
list.ForEach((x) => parent.AddChild(x));
}
}
catch (Exception ex)
{
Console.WriteLine(value+" :"+ex.Message);
}
if (list != null && list.Count > 0)
{
foreach (var num in list)
yield return num;
}
#endregion
//判断是否有子节点
child = parent.PushChild();
if (child == null)
{
//如果没有子节点,则回溯至上层,否则跳出(表示遍历结束)
again: if (parent.Depth > 0)
{
parent = parent.Parent;
}
else yield break;
child = parent.PushChild();
if (child == null) goto again;
}
//作为父节点 进行循环
parent = child;
}
#endregion
}
public static List<int> Power(int value)
{
List<int> list = new List<int>();
int start = value * 10 + 1;
foreach (int i in Enumerable.Range(start,10))
{
if (i > 85 && i < 90) throw new Exception("85->90");
if (i > 250) throw new Exception("greater than 250");
list.Add(i);
}
return list;
}
}
class NTree<T>
{
private T data;
public T Data { get { return data; } }
private int depth;
public int Depth { get { return depth; } }
private NTree<T> parent = null;
public NTree<T> Parent { get { return parent; } }
LinkedList<NTree<T>> children;
public NTree(T data)
{
this.data = data;
//默认是根节点
this.depth = 0;
this.parent = null;
children = new LinkedList<NTree<T>>();
}
/// <summary>
/// 用于添加子节点
/// </summary>
/// <param name="data"></param>
/// <param name="depth"></param>
private NTree(T data,NTree<T> parent,int depth)
{
this.data = data;
this.parent = parent;
this.depth = depth;
children = new LinkedList<NTree<T>>();
}
public void AddChild(T data)
{
children.AddFirst(new NTree<T>(data,this, depth + 1));
}
public NTree<T> GetChild(int i)
{
foreach (NTree<T> n in children)
if (--i == 0) return n;
return null;
}
/// <summary>
/// 获取第一个子节点
/// </summary>
/// <returns></returns>
public NTree<T> FirstChild()
{
if (children.Count > 0)
{
return children.First.Value;
}
return null;
}
/// <summary>
/// 判断是否有子节点
/// </summary>
/// <returns></returns>
public bool HasChild()
{
if (children.Count > 0)
{
return true;
}
return false;
}
/// <summary>
/// 弹出一个子节点 并Remove
/// </summary>
/// <returns></returns>
public NTree<T> PushChild()
{
if (children.Count > 0)
{
NTree<T> n = children.First.Value;
children.RemoveFirst();
return n;
}
return null;
}
}
}
浙公网安备 33010602011771号