C# 实现的二叉树遍历算法解决方案

C# 实现的二叉树遍历算法解决方案

本人用C#2.0实现了二叉树的定义,怎么构造一颗已知的二叉树,用几种常规的算法(先序,中序,后序,层次)遍历二叉树。希望能给有需要人带来帮助,也希望能得到大家的指点。有关C#数据结构的书在书店里找到,网上也是极少,如果你有好的学习资源别忘了告诉我。先谢了。数据结构对一个程序员来说,现在是太重要了,数据结构学得好的人,逻辑思维一定很强,在程序设计的时候,就不会觉得太费劲了。而且是在设计多层应用程序的时候,真是让人绞尽脑汁啊。趁自己还年轻,赶紧练练脑子。哈哈,咱们尽快进入主题吧。

本程序中将用到一棵已知的二叉树如图(二叉树图)所示。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 266.25pt; HEIGHT: 180.75pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.cnblogs.com/images/cnblogs_com/xuanfeng/binTree.JPG" src="file:///C:/DOCUME~1/pioneer/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg"></imagedata></shape>

下面简单介绍一下几种算法和思路:

先序遍历:

1. 访问根结点

2. 按先序遍历左子树;

3. 按先序遍历右子树;

4. 例如:遍历已知二叉树结果为:A->B->D->G->H->C->E->F

中序遍历:

1. 按中序遍历左子树;

2. 访问根结点;

3. 按中序遍历右子树;

4. 例如遍历已知二叉树的结果:B->G->D->H->A->E->C->F

后序遍历:

1. 按后序遍历左子树;

2. 按后序遍历右子树;

3. 访问根结点;

4. 例如遍历已知二叉树的结果:G->H->D->B->E->F->C->A

层次遍历:

1. 从上到下,从左到右遍历二叉树的各个结点(实现时需要借辅助容器)

2. 例如遍历已知二叉树的结果:A->B->C->D->E->F->G->H

代码:

usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespacestructure { ///<summary> ///二叉遍历算法解决方案 ///</summary> classProgram { //二叉树结点数据结构的定义二叉树结点数据结构的定义 //二叉树结点数据结构包括数据域左右结点以及父结点成员 classnodes<T> { Tdata; nodes<T>Lnode,Rnode,Pnode; publicTData { set{data=value;} get{returndata;} } publicnodes<T>LNode { set{Lnode=value;} get{returnLnode;} } publicnodes<T>RNode { set{Rnode=value;} get{returnRnode;} } publicnodes<T>PNode { set{Pnode=value;} get{returnPnode;} } publicnodes() { } publicnodes(Tdata) { this.data=data; } } //先序编历二叉树先序编历二叉树 staticvoidPreOrder<T>(nodes<T>rootNode) { if(rootNode!=null) { Console.WriteLine(rootNode.Data); PreOrder<T>(rootNode.LNode); PreOrder<T>(rootNode.RNode); } } //构造一棵已知的二叉树构造一棵已知的二叉树 staticnodes<string>BinTree() { nodes<string>[]binTree=newnodes<string>[8]; //创建结点 binTree[0]=newnodes<string>("A"); binTree[1]=newnodes<string>("B"); binTree[2]=newnodes<string>("C"); binTree[3]=newnodes<string>("D"); binTree[4]=newnodes<string>("E"); binTree[5]=newnodes<string>("F"); binTree[6]=newnodes<string>("G"); binTree[7]=newnodes<string>("H"); //使用层次遍历二叉树的思想构造一个已知的二叉树 binTree[0].LNode=binTree[1]; binTree[0].RNode=binTree[2]; binTree[1].RNode=binTree[3]; binTree[2].LNode=binTree[4]; binTree[2].RNode=binTree[5]; binTree[3].LNode=binTree[6]; binTree[3].RNode=binTree[7]; //返回二叉树的根结点 returnbinTree[0]; } //中序遍历二叉树中序遍历二叉树 staticvoidMidOrder<T>(nodes<T>rootNode) { if(rootNode!=null) { MidOrder<T>(rootNode.LNode); Console.WriteLine(rootNode.Data); MidOrder<T>(rootNode.RNode); } } //后序遍历二叉树后序遍历二叉树 staticvoidAfterOrder<T>(nodes<T>rootNode) { if(rootNode!=null) { AfterOrder<T>(rootNode.LNode); AfterOrder<T>(rootNode.RNode); Console.WriteLine(rootNode.Data); } } //层次遍历二叉树层次遍历二叉树 staticvoidLayerOrder<T>(nodes<T>rootNode) { nodes<T>[]Nodes=newnodes<T>[20]; intfront=-1; intrear=-1; if(rootNode!=null) { rear++; Nodes[rear]=rootNode; } while(front!=rear) { front++; rootNode=Nodes[front]; Console.WriteLine(rootNode.Data); if(rootNode.LNode!=null) { rear++; Nodes[rear]=rootNode.LNode; } if(rootNode.RNode!=null) { rear++; Nodes[rear]=rootNode.RNode; } } } staticvoidMain(string[]args) { nodes<string>rootNode=BinTree(); Console.WriteLine("先序遍历方法遍历二叉树:"); PreOrder<string>(rootNode); Console.WriteLine("中序遍历方法遍历二叉树:"); MidOrder<string>(rootNode); Console.WriteLine("后序遍历方法遍历二叉树:"); AfterOrder<string>(rootNode); Console.WriteLine("层次遍历方法遍历二叉树:"); LayerOrder<string>(rootNode); Console.ReadLine(); } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值