ASP.NET教程之数据布局与算法(C#完成)系列---树
它有很多缺点的,有兴趣可以到网上去搜索一下。于是微软有发明了“下一代”C++:C++/CLI语言,这个可以解决在.NETFramework中,托管C++产生的问题。在《程序员》杂志上,lippman和李建中合作连载介绍了C++/CLI语言。数据|数据布局|算法 起首我们给树下一个界说:树是一个无限的、非空的结点集,T={r}orT1orT2or…orTn它具有以下性子:
1.汇合指定的结点r叫做树的根结点
2.其他的结点能够分别成n个子集,T1,T2,…Tn(n>=0),个中每个子集都是一棵树。
树的别的界说如度,叶子,初等就请人人查阅其余材料吧,各处都有的。
树的次要性子一个就是遍历,分为深度遍历和广度遍历
在这里分离完成为DepthFirstTravesal()和WidthFirstTravesal()
个中深度遍历又分为前序遍历、中序遍历、和后序遍历,这是是接纳适配器手艺完成的。
usingSystem;
usingSystem.Collections;
namespaceDataStructure
{
///<summary>
///Tree的择要申明。
///whentraverse,traversaltypecantbechanged,orthrowaexception
///撑持列举、对照、深度复制
///</summary>
publicabstractclassTree:IEnumerable,IComparable
{
publicTree()
{
//
//TODO:在此处增加机关函数逻辑
//
}
protectedQueuekeyqueue=newQueue();//仅仅用于列举时寄存数据,不介入Equals完成中的对照
protectedTraversalTypetraversaltype=TraversalType.Breadth;//chooseatraversaltype,andDepthFirstisdefault
//protecteduintdegree=0;//degreeofthetree,inititas0
//protecteduintheight=0;//heightofthetree,inititas0
//列举分歧的遍历范例
publicenumTraversalType
{
Breadth=1,//广度遍历
PreDepth=2,//前序遍历
InDepth=3,//中序遍历
PostDepth=4//后序遍历
};
//publicvirtualabstractobjectKey{}
publicabstractTreethis{get;set;}//ifIonlyuseget,canIchangeitlater?
publicabstractobjectKey{get;}
publicabstractuintDegree{get;}
//publicabstractuintHeight{get;}
publicvoidSetTraversalType(TraversalType_type){traversaltype=_type;}//setatraversalatype,ifitsnotsetmanually,DepthFirstwillbechosenindefault
publicabstractboolIsEmpty();//propertytakestheplaceofIsEmpty()
publicabstractboolIsLeaf();
//OnlyVisit,needntqueue
publicvirtualvoidDepthFirstTraversal(IPrePostVisitor_vis)//middledepthfirsttraversal
{
//经由过程_vis利用分歧的会见者来举行前序、后序、中序遍历
if(!IsEmpty())
{
_vis.PreVisit(this.Key);
if(this.Degree>=1)
{
if(this.Degree>=2)
{
for(uinti=0;i<(this.Degree-1);i++)//
{
this.DepthFirstTraversal(_vis);//recursivecall
//_vis.Visit(this.Key);
}
}
this.DepthFirstTraversal(_vis);
}
_vis.PostVisit(this.Key);
}
}
publicvirtualvoidBreadthFirstTraversal(IVisitor_vis)//breadthfirsttraversal
{
QueuetmpQueue=newQueue();//usedtohelpBreadthFirstTraversal
//this.keyqueue=newQueue();//storekeys
if(!this.IsEmpty())
tmpQueue.Enqueue(this);//enqueuetherootnodeatfirst
while(tmpQueue.Count!=0)//untilthenumberofthequeueiszero
{
TreeheadTree=(Tree)tmpQueue.Dequeue();
//this.keyqueue.Enqueue(headTree.Key);
_vis.Visit(headTree.Key);
for(uinti=0;i<headTree.Degree;i++)
{
TreechildTree=headTree;
if(!childTree.IsEmpty())
tmpQueue.Enqueue(childTree);
}
}
}
publicclassInOrder:IPrePostVisitor
{
privateIVisitorvisitor;
publicInOrder(IVisitor_vis){visitor=_vis;}
#regionIPrePostVisitor成员
publicvoidPreVisit(object_obj)
{
//TODO:增加InOrder.PreVisit完成
}
publicvoidVisit(object_obj)
{
//TODO:增加InOrder.Visit完成
this.visitor.Visit(_obj);
}
publicvoidPostVisit(object_obj)
{
//TODO:增加InOrder.PostVisitor完成
}
#endregion
}
publicclassPostOrder:IPrePostVisitor
{
privateIVisitorvisitor;
publicPostOrder(IVisitor_vis){visitor=_vis;}
#regionIPrePostVisitor成员
publicvoidPreVisit(object_obj)
{
//TODO:增加PostOrder.PreVisit完成
}
publicvoidVisit(object_obj)
{
//TODO:增加PostOrder.Visit完成
}
publicvoidPostVisit(object_obj)
{
//TODO:增加PostOrder.PostVisitor完成
this.visitor.Visit(_obj);
}
#endregion
}
protectedclassEnumVisitor:IVisitor
{
QueuethisQueue;
publicEnumVisitor(Queue_que)
{
this.thisQueue=_que;
}
#regionIVisitor成员
publicvoidVisit(object_obj)
{
//TODO:增加EnumVisitor.Visit完成
this.thisQueue.Enqueue(_obj);
}
#endregion
}
#regionIEnumerable成员
publicIEnumeratorGetEnumerator()
{
//TODO:增加Tree.GetEnumerator完成
EnumVisitorvis=newEnumVisitor(this.keyqueue);
switch(this.traversaltype)
{
caseTraversalType.Breadth:
BreadthFirstTraversal(vis);
break;
caseTraversalType.PreDepth:
PreOrderpreVis=newPreOrder(vis);
DepthFirstTraversal(preVis);
break;
caseTraversalType.InDepth:
InOrderinVis=newInOrder(vis);
DepthFirstTraversal(inVis);
break;
caseTraversalType.PostDepth:
PostOrderpostVis=newPostOrder(vis);
DepthFirstTraversal(postVis);
break;
default:
Console.WriteLine("WARNING:pleasesetatraveltypefirst!--voidSetTraversalType(TraversalType_type)");
//thrownewException("WARNING:pleasesetatraveltypefirst!");//ifnotsetatype,aexceptionwillhappen
break;
}
returnthis.keyqueue.GetEnumerator();
}
#endregion
//overwriteObject.Equals()---referencetyperealization
publicoverrideboolEquals(object_obj)
{
if(_obj==null)
returnfalse;//由于this不成能为null
if(!(this.GetType()==_obj.GetType()))
returnfalse;//范例不相称也不相称
TreetmpObj=(Tree)_obj;
//对照援用成员
if(!Object.Equals(this.Key,tmpObj.Key))
returnfalse;
//对照值范例成员
if(!this.Degree.Equals(tmpObj.Degree))
returnfalse;
//if(!this.Height.Equals(tmpObj.Height))
//returnfalse;
returntrue;
}
//在此重载==,!=后,在今后承继的类中不用完成了
publicstaticbooloperator==(Tree_treeA,Tree_treeB)
{
returnObject.Equals(_treeA,_treeB);
}
publicstaticbooloperator!=(Tree_treeA,Tree_treeB)
{
return!(_treeA==_treeB);
}
#regionIComparable成员
publicvirtualintCompareTo(objectobj)
{
//TODO:增加Tree.CompareTo完成
return0;
}
#endregion
}
}
我见过java运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《Java的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。 在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗? ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。 有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。 微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。 碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。 ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
页:
[1]