zoukankan      html  css  js  c++  java
  • 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();         }     } }

     

  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/secbook/p/2655353.html
Copyright © 2011-2022 走看看