資料結構與演算法(C#實現)系列---樹(一) (轉)

themoney發表於2007-09-15
資料結構與演算法(C#實現)系列---樹(一) (轉)[@more@]

  資料結構與演算法(實現)系列---樹(一)

  Heavenkiller(原創)

首先我們給樹下一個定義:

樹是一個有限的、非空的結點集,

T={r} or T1 or T2 or…or Tn

它具有下列性質:

1.集合指定的結點r叫做樹的根結點

2.其餘的結點可以劃分成n個子集,T1,T2,…Tn(n>=0),其中每一個子集都是一棵樹。

:namespace prefix = o ns = "urn:schemas--com::office" />

樹的其它定義如度,葉子,高等就請大家查閱別的資料吧,到處都有的。

樹的主要性質一個就是遍歷,分為深度遍歷和廣度遍歷

在這裡分別實現為DepthFirstTravesal()和WidthFirstTravesal()

其中深度遍歷又分為前序遍歷、中序遍歷、和後序遍歷

這是是採用介面卡技術實現的。

using System;

using System.Collections;

namespace DataStructure

{

  ///

  /// Tree 的摘要說明。

  /// when traverse, traversaltype can't be changed,or throw a  exception

  /// 支援列舉、比較、深度複製

  ///

  public abstract class Tree:IEnumerable,IComparable

  {

  public Tree()

  {

  //

  // TODO: 在此處新增構造邏輯

  //

  }

  protected Queue keyqueue=new Queue();//僅僅用於列舉時存放資料,不參與Equals實現中的比較

  protected TraversalType traversaltype=TraversalType.Breadth;// choose a traversal  type,and  DepthFirst is default

  //protected uint degree=0;//degree of the tree, init  it as 0

  //protected uint height=0;//height of the tree, init it as 0

  //列舉不同的遍歷型別

  public enum TraversalType

  {

  Breadth=1,//廣度遍歷

  PreDepth=2,//前序遍歷

  InDepth=3,//中序遍歷

  PostDepth=4//後序遍歷

   

  };

  //public virtual abstract   Key{}

 

  public abstract Tree this[uint _index]{get;set;}//if I only use get, can I change it later?

  public  abstract object Key{get;}

  public  abstract uint Degree{get;}

  //public  abstract uint Height{get;}

  public  void SetTraversalType(TraversalType _type){traversaltype=_type;}//set a traversal a type, if it's not set manually, DepthFirst will be chosen in default

  public  abstract bool IsEmpty();// property takes the place of IsEmpty()

  public  abstract bool IsLeaf();

 

  //Only Visit, needn't queue

  public virtual void DepthFirstTraversal(IPrePostVisitor _vis)//middle depthfirst traversal

  {

  //透過_vis使用不同的訪問者來進行前序、後序、中序遍歷

 

 

  if(!IsEmpty())

  {

  _vis.PreVisit(this.Key);

  if( this.Degree>=1 )

  {

  if( this.Degree>=2)

  {

  for(uint i=0;i

  {

  this[i].DepthFirstTraversal(_vis);//recursive call

  //_vis.Visit(this.Key);

  }

  }

  this[this.Degree-1].DepthFirstTraversal(_vis);

  }

  _vis.PostVisit(this.Key);

  }

 

 

  }

 

  public virtual void BreadthFirstTraversal(IVisitor _vis)//breadth first traversal

  {

  Queue tmpQueue=new Queue();//used to help BreadthFirstTraversal

  //this.keyqueue=new Queue();//store keys

  if(!this.IsEmpty())

  tmpQueue.Enqueue(this);//enqueue the node at first

  while(tmpQueue.Count!=0)//until the number of the queue is zero

  {

  Tree headTree=(Tree)tmpQueue.Dequeue();

  //this.keyqueue.Enqueue(headTree.Key);

  _vis.Visit(headTree.Key);

 

  for(uint i=0;i

  {

  Tree childTree=headTree[i];

  if(!childTree.IsEmpty())

  tmpQueue.Enqueue(childTree);

  }

  }

  }

 

  //------------------------------------------------end------------------------------------

  //內部成員類 用於提供不同遍歷型別的訪問者

  public class PreOrder:IPrePostVisitor

  {

  private IVisitor visitor;

  public PreOrder(IVisitor _vis){visitor=_vis;}

  #region IPrePostVisitor 成員

  public void PreVisit(object _obj)

  {

  // TODO:  新增 PreOrder.PreVisit 實現

  this.visitor.Visit(_obj);

  }

  public void Visit(object _obj)

  {

  // TODO:  新增 PreOrder.Visit 實現

  }

  public void PostVisit(object _obj)

  {

  // TODO:  新增 PreOrder.PostVisitor 實現

  }

  #endregion

  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-969622/,如需轉載,請註明出處,否則將追究法律責任。

相關文章