数据结构与算法 (C# 实现 ) 系列 --- 树 ( 二 )
Heavenkiller( 原创 )
public class InOrder:IPrePostVisitor
{
private IVisitor visitor;
public InOrder(IVisitor _vis){visitor=_vis;}
#region IPrePostVisitor 成员
public void PreVisit( object _obj)
{
// TODO: 添加 InOrder.PreVisit 实现
}
public void Visit( object _obj)
{
// TODO: 添加 InOrder.Visit 实现
this .visitor.Visit(_obj);
}
public void PostVisit( object _obj)
{
// TODO: 添加 InOrder.PostVisitor 实现
}
#endregion
}
public class PostOrder:IPrePostVisitor
{
private IVisitor visitor;
public PostOrder(IVisitor _vis){visitor=_vis;}
#region IPrePostVisitor 成员
public void PreVisit( object _obj)
{
// TODO: 添加 PostOrder.PreVisit 实现
}
public void Visit( object _obj)
{
// TODO: 添加 PostOrder.Visit 实现
}
public void PostVisit( object _obj)
{
// TODO: 添加 PostOrder.PostVisitor 实现
this .visitor.Visit(_obj);
}
#endregion
}
protected class EnumVisitor:IVisitor
{
Queue thisQueue;
public EnumVisitor(Queue _que)
{
this .thisQueue=_que;
}
#region IVisitor 成员
public void Visit( object _obj)
{
// TODO: 添加 EnumVisitor.Visit 实现
this .thisQueue.Enqueue(_obj);
}
#endregion
}
#region IEnumerable 成员
public IEnumerator GetEnumerator()
{
// TODO: 添加 Tree.GetEnumerator 实现
EnumVisitor vis= new EnumVisitor( this .keyqueue);
switch ( this .traversaltype)
{
case TraversalType.Breadth:
BreadthFirstTraversal(vis);
break ;
case TraversalType.PreDepth:
PreOrder preVis= new PreOrder(vis);
DepthFirstTraversal(preVis);
break ;
case TraversalType.InDepth:
InOrder inVis= new InOrder(vis);
DepthFirstTraversal(inVis);
break ;
case TraversalType.PostDepth:
PostOrder postVis= new PostOrder(vis);
DepthFirstTraversal(postVis);
break ;
default :
Console.WriteLine("WARNING:please set a travel type first!--void SetTraversalType(TraversalType _type) ");
//throw new Exception("WARNING:please set a travel type first!");//if not set a type, a exception will happen
break ;
}
return this .keyqueue.GetEnumerator();
}
#endregion