设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> 网络编程 >> ASP.NET >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
基于JDBC的数据库连接池…
ASP.NET技巧:获取数据行…
PHP与数据库连接
MySQL数据库结构和数据的…
PHP中操作MySQL数据库的…
用PHP程序实现树状结构的…
PHP 5 数据对象 (PDO) 抽…
用PHP调用数据库的存贮过…
PHP文本数据库的搜索方法
用IE远程创建Mysql数据库…
  数据结构与算法(C#实现)系列---树           
数据结构与算法(C#实现)系列---树
 

  首先我们给树下一个定义: 树是一个有限的、非空的结点集, T={r} or T1 or T2 or…or Tn 
   
  它具有下列性质: 
   
  1.集合指定的结点r叫做树的根结点 
   
  2.其余的结点可以划分成n个子集,T1,T2,…Tn(n>=0),其中每一个子集都是一棵树。 
       
  树的其它定义如度,叶子,高等就请大家查阅别的资料吧,到处都有的。 
   
  树的主要性质一个就是遍历,分为深度遍历和广度遍历 
   
  在这里分别实现为DepthFirstTravesal()和WidthFirstTravesal() 
   
  其中深度遍历又分为前序遍历、中序遍历、和后序遍历 ,这是是采用适配器技术实现的。 
    
  using System;
  
  using System.Collections;
  
  
  
  namespace DataStructure
  
  {
  
   /// <summary>
  
   /// Tree 的摘要说明。
  
   /// when traverse, traversaltype can't be changed,or throw a exception
  
   /// 支持枚举、比较、深度复制
  
   /// </summary>
  
   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 object 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.Degree-1);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 root 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<headTree.Degree;i++)
  
   {
  
   Tree childTree=headTree[i];
  
   if(!childTree.IsEmpty())
  
   tmpQueue.Enqueue(childTree);
  
   }
  
   }
  
  
  
   }

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);

[1] [2] 下一页  

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2006-10-26
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:admin    责任编辑:admin 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持