|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
它有很多缺点的,有兴趣可以到网上去搜索一下。于是微软有发明了“下一代”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[uint_index]{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[i].DepthFirstTraversal(_vis);//recursivecall
//_vis.Visit(this.Key);
}
}
this[this.Degree-1].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[i];
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的跨平台也当之无愧是一句谎言。 |
|