当前位置:首页 > 日记 > 正文

数据结构与算法C#实施系列--树1

数据结构与算法C#实施系列--树1

       数据结构与算法(C#实现)系列---树(一)


                                          Heavenkiller(原创)


首先我们给树下一个定义:


树是一个有限的、非空的结点集,


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


{


     ///


     /// 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 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

                   {


                       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


 


         }


 


相关文章

风暴声2012在线热播空中小姐

风暴声2012在线热播空中小姐

在线,空中小姐,热播,风暴,电脑软件,暴风影音2012在线热播《和空姐一起的日子》3月26日,改编自著名网络小说《和空姐同居的日子》的电视剧《和空姐一起的日子》在央视八套电视剧频道首播,由于此前这部网络小说一举创下了2亿人次的惊人点击率,并…

点评百度需要面对的6大危机

点评百度需要面对的6大危机

百度,危机,点评,电脑软件,百度需要解决的六大危机分别是作家群体,同时也是内容版权方,由恶性竞价排名带来的广告客户流失,来自微博这一新兴传播媒体对传统搜索领域的挑战,以及最为人诟病的企业文化问题,即傲慢和不诚信。百度深度危机 1 韩寒百度…

Windows7双硬盘自动关闭

Windows7双硬盘自动关闭

自动关闭,双硬盘,电脑软件,随着硬盘价格的迅速下降,使用双硬盘的朋友是越来越多,一般都是将其中一块作为系统主盘,另一块作为从盘存储文件。如果你使用的是Windows7,那么会经常听到硬盘停止和启动的声音,例如关闭计算机时,系统会自动启动从盘(如果…

(十二)给房间一个材料

(十二)给房间一个材料

房间,材料,电脑软件,十二,                                                                                                     …

pas-smvs短信增值服务系统

pas-smvs短信增值服务系统

系统,增值服务,短信,电脑软件,pas,系统概述   PAS-SMVS 短消息增值服务系统通过将呼叫中心平台和短消息中心相结合,非常方便地实现各种短信增值服务。人们可以通过各种终端设备从该系统得到诸如股票价格、航班时刻、天气情况等非常实用的…

Windows7通过空格键快速调用引导管

Windows7通过空格键快速调用引导管

调用,空格键,管理器,快速,电脑软件,若想进入Windows XP系统的安全模式,则必须要在启动画面出现前“狂按”F8键。而在Windows Vista系统中,比传统的各种功能菜单选项有所改进,并被命名为“Windows治理器”。同样可通过F8键进入,不过,很多用户可能…

Ari的最新下载工具排行榜:雷云加速

Ari的最新下载工具排行榜:雷云加速

下载工具,排行榜,最新,电脑软件,Ari,近日,iResearch艾瑞咨询推出的网民连续用户行为研究系统iUserTracker最新数据,结果显示:2013年6月,迅雷Thunder日均覆盖人数达3609万人,网民到达率达12.1%,遥遥领先稳居头把交椅;迅雷旗下另一款产品迅雷迷你版…

微软没有推iPadOffice:保留表面的唯

微软没有推iPadOffice:保留表面的唯

卖点,表面,电脑软件,iPadOffice,科技博客TechCrunch近日撰文称,微软刚推出了iPhone版Office 365,但并未推出iPad版本;如果Office登陆iPad,微软自家平板电脑Surface唯一真正的卖点也就荡然无存,销量必定更加惨淡。以下是文章主要内容:还记得微软…

迅雷凸显云加速大数据时代的商业模

迅雷凸显云加速大数据时代的商业模

大数据时代,商业模式,迅雷,电脑软件,大数据时代已经来临,各大互联网公司都在争分夺秒抢占这一黄金机遇。2013年8月13日,中国互联网大会在京召开。国内云加速领军者迅雷吹响大数据时代的新号角,将依托全球领先的云加速技术,构建一个新的商业版图…

恶意程序破坏Skype自动下载应用程

恶意程序破坏Skype自动下载应用程

黑客,自动下载,应用程序,赚钱,恶意程序,【讯】北京时间4月7日消息,据国外媒体报道,一款新型恶意程序正肆虐微软的即时聊天工具Skype。据悉,该恶意程序名为Trojan.Win32.Jorik.IRCbot.xkt,通过点击链接的方式传播。不同的是,传统的恶意软件多是为…

Windows7系统的蓝屏处理方法及解决

Windows7系统的蓝屏处理方法及解决

处理方法,系统,蓝屏,解决方案,电脑软件,在使用Windows 7时遇到蓝屏,很多用户束手无策,其实蓝屏并不可怕,下面小编就给大家讲讲蓝屏的处理方法和解决方案。  一、Windows 7蓝屏的含义  1、故障检查信息  ***STOP 0x0000001E(0xC0000005,0x…

谷歌驱动新的PC/Mac文件快速共享功

谷歌驱动新的PC/Mac文件快速共享功

文件,快速,功能,电脑软件,PC,【讯】北京时间5月7日消息,据国外媒体报道,从前,我们可以从PC/Mac的文件管理系统中查看并管理Google Drive文件,但无法直接将文件分享给好友。到了今天,Google Drive上的文件分享正变得更加容易。PC或Mac上的用户现…