C#实现二叉树遍历

it2022-05-09  13

  二叉树遍历,很是陈词滥调了。一般分三种遍历方式(先序遍历、中序遍历、后序遍历)。只是以前自己一直真正的去写过。最近上班没有什么事,就随便写写,填塞一下自己上班空闲时空虚的心情。

  

  一个二叉树节点所持有的信息有哪些?我的这个二叉树,每个节点有四个信息,分别是:父节点信息、左子节点信息、右子节点信息以及节点的内容。

 

  详细的不描述了,让代码来说话吧:

  

代码 using  System; using  System.Collections.Generic; using  System.Linq; using  System.Text; namespace  ConsoleApp_BinaryTree{     public   class  Node < T >     {         // 节点数据           private  T _Data;         // 左子节点           private  Node < T >  _LNode;         // 右子节点           private  Node < T >  _RNode;         // 父节点           private  Node < T >  _PNode;         public  Node()        {                 }         public  Node(T data)        {            _Data  =  data;        }         public  T Data        {             get  {  return  _Data; }             set  { _Data  =  value; }        }         public  Node < T >  LNode        {             get  {  return  _LNode; }             set  { _LNode  =  value; }        }         public  Node < T >  RNode        {             get  {  return  _RNode; }             set  { _RNode  =  value; }        }         public  Node < T >  PNode        {             get  {  return  _PNode; }             set  { _PNode  =  value; }        }    }}

 

  

  那么,我要遍历的二叉树对象又是谁呢?如下图所示,这是我即将要遍历的二叉树。

  看到这个图形,大家以可以知道,分三种方式遍历这棵二叉树的结果:

  先序遍历:A B D G H C E F

  中序遍历:B G D H A E C F

  后序遍历:G H D B E F C A

 

  以上这个结果是我们分析所得,那么我们用程序写出来又是什么样子的呢,下面就来实践一下吧!

 

  

 

代码 using  System; using  System.Collections.Generic; using  System.Linq; using  System.Text; namespace  ConsoleApp_BinaryTree{     class  Program    {         static   void  Main( string [] args)        {             // 先初始化二叉树(要遍历它,当然要先对它进行初始化了~~)               // 先初始化A/B/C/D/E/F/G/H这些节点               Node < string >  nodeA  =   new  Node < string > ( " A " );            Node < string >  nodeB  =   new  Node < string > ( " B " );            Node < string >  nodeC  =   new  Node < string > ( " C " );            Node < string >  nodeD  =   new  Node < string > ( " D " );            Node < string >  nodeE  =   new  Node < string > ( " E " );            Node < string >  nodeF  =   new  Node < string > ( " F " );            Node < string >  nodeG  =   new  Node < string > ( " G " );            Node < string >  nodeH  =   new  Node < string > ( " H " );             // 再将这些节点建立关系,让其形成一棵名符其实的二叉树             SetNodeInfo < string > ( ref  nodeG,  null null , nodeD);            SetNodeInfo < string > ( ref  nodeH,  null null , nodeD);            SetNodeInfo < string > ( ref  nodeD, nodeG, nodeH, nodeB);            SetNodeInfo < string > ( ref  nodeB,  null , nodeD, nodeA);            SetNodeInfo < string > ( ref  nodeE,  null null , nodeC);            SetNodeInfo < string > ( ref  nodeF,  null null , nodeC);            SetNodeInfo < string > ( ref  nodeC, nodeE, nodeF, nodeA);            SetNodeInfo < string > ( ref  nodeA, nodeB, nodeC,  null );             while  ( true )            {                Console.WriteLine();                Console.WriteLine( " 1、先序遍历 " );                Console.WriteLine( " 2、中序遍历 " );                Console.WriteLine( " 3、后序遍历 " );                Console.Write( " input num: " );                 string  num  =  Console.ReadLine();                 switch  (num)                {                     case   " 1 " : RootFirst < string > (nodeA);  break ;                     case   " 2 " : RootSecond < string > (nodeA);  break ;                     case   " 3 " : RootLast < string > (nodeA);  break ;                     default break ;                }            }        }                 // 设置节点信息          protected   static   void  SetNodeInfo < T > ( ref  Node < T >  node, Node < T >  l, Node < T >  r, Node < T >  p)        {            node.LNode  =  l;            node.RNode  =  r;            node.PNode  =  p;        }         // 先序遍历          protected   static   void  RootFirst < T > (Node < T >  root)        {             if  (root  !=   null )            {                Console.Write(root.Data + "    " );                RootFirst < T > (root.LNode);                RootFirst < T > (root.RNode);            }        }         // 中序遍历          protected   static   void  RootSecond < T > (Node < T >  root)        {             if  (root  !=   null )            {                RootSecond < T > (root.LNode);                Console.Write(root.Data  +   "    " );                RootSecond < T > (root.RNode);            }        }         // 后序遍历          protected   static   void  RootLast < T > (Node < T >  root)        {             if  (root  !=   null )            {                RootLast < T > (root.LNode);                RootLast < T > (root.RNode);                Console.Write(root.Data  +   "    " );            }        }    }}

 

 

  到此为止,代码部分己经全部写完了,运行看一下结果吧!  

转载于:https://www.cnblogs.com/liu2008hz/archive/2010/10/29/1864621.html


最新回复(0)