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
//overwrite Object.Equals() --- reference type realization
public override bool Equals(object _obj)
{
if( _obj==null )
return false;//因為this不可能為null
if( ! (this.GetType()==_obj.GetType()) )
return false;//類型不相等也不相等
Tree tmpObj=(Tree)_obj;
//比較引用成員
if( !Object.Equals(this.Key,tmpObj.Key) )
return false;
//比較值類型成員
if( !this.Degree.Equals(tmpObj.Degree) )
return false;
//if( !this.Height.Equals(tmpObj.Height) )
//return false;
return true;
}
//在此重載 ==,!= 後, 在以後繼承的類中不必實現了
public static bool Operator==(Tree _treeA,Tree _treeB)
{
return Object.Equals(_treeA,_treeB);
}
public static bool Operator!=(Tree _treeA,Tree _treeB)
{
return !(_treeA==_treeB);
}
#region IComparable 成員
public virtual int CompareTo(object obj)
{
// TODO: 添加 Tree.CompareTo 實現
return 0;
}
#endregion
}
}