C#中实现二叉树的遍历

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

本人用C#2.0实现了二叉树的定义,怎么构造一颗已知的二叉树,用几种常规的算法(先序,中序,后序,层次)遍历二叉树。希望能给有需要人带来帮助,也希望能得到大家的指点。有关C#数据结构的书在书店里找到,网上也是极少,如果你有好的学习资源别忘了告诉我。先谢了。   本程序中将用到一棵已知的二叉树如图(二叉树图)所示。

 

 

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

先序遍历:

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

 

代码:
using  System; using  System.Collections.Generic; using  System.Text; namespace  structure {      ///   <summary>      ///  二叉遍历算法解决方案      ///   </summary>      class  Program     {          // 二叉树结点数据结构的定义  二叉树结点数据结构的定义           // 二叉树结点数据结构包括数据域  左右结点以及父结点成员          class  nodes < T >         {             T data;             nodes < T >  Lnode, Rnode, Pnode;              public  T Data             {                  set  { data  =  value; }                  get  {  return  data; }             }              public  nodes < T >  LNode             {                  set  { Lnode  =  value; }                  get  {  return  Lnode; }             }              public  nodes < T >  RNode             {                  set  { Rnode  =  value; }                  get  {  return  Rnode; }             }              public  nodes < T >  PNode             {                  set  { Pnode  =  value; }                  get  {  return  Pnode; }             }              public  nodes()             {             }              public  nodes(T data)             {                  this .data  =  data;             }         }          // 先序编历二叉树  先序编历二叉树          static   void  PreOrder < T > (nodes < T >  rootNode)         {              if  (rootNode  !=   null )             {                 Console.WriteLine(rootNode.Data);                 PreOrder < T > (rootNode.LNode);                 PreOrder < T > (rootNode.RNode);             }         }          // 构造一棵已知的二叉树  构造一棵已知的二叉树          static  nodes < string >  BinTree()         {             nodes < string > [] binTree  =   new  nodes < string > [ 8 ];              // 创建结点             binTree[ 0 =   new  nodes < string > ( " A " );             binTree[ 1 =   new  nodes < string > ( " B " );             binTree[ 2 =   new  nodes < string > ( " C " );             binTree[ 3 =   new  nodes < string > ( " D " );             binTree[ 4 =   new  nodes < string > ( " E " );             binTree[ 5 =   new  nodes < string > ( " F " );             binTree[ 6 =   new  nodes < string > ( " G " );             binTree[ 7 =   new  nodes < 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 ];              // 返回二叉树的根结点              return  binTree[ 0 ];         }          // 中序遍历二叉树  中序遍历二叉树          static   void  MidOrder < T > (nodes < T >  rootNode)         {              if  (rootNode  !=   null )             {                 MidOrder < T > (rootNode.LNode);                 Console.WriteLine(rootNode.Data);                 MidOrder < T > (rootNode.RNode);             }         }          // 后序遍历二叉树  后序遍历二叉树          static   void  AfterOrder < T > (nodes < T >  rootNode)         {              if  (rootNode  !=   null )             {                 AfterOrder < T > (rootNode.LNode);                 AfterOrder < T > (rootNode.RNode);                 Console.WriteLine(rootNode.Data);             }         }          // 层次遍历二叉树  层次遍历二叉树          static   void  LayerOrder < T > (nodes < T >  rootNode)         {             nodes < T > [] Nodes  =   new  nodes < T > [ 20 ];              int  front  =   - 1 ;              int  rear  =   - 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;                 }             }         }          static   void  Main( 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();         }     } }
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值