• 二叉树的遍历--C#程序举例二叉树的遍历


    二叉树的遍历--C#程序举例二叉树的遍历

    关于二叉树的介绍笨男孩前面写过一篇博客

    二叉树的简单介绍以及二叉树的存储结构

    遍历方案

    二叉树的遍历分为以下三种:

    先序遍历:遍历顺序规则为【根左右】

    中序遍历:遍历顺序规则为【左根右】

    后序遍历:遍历顺序规则为【左右根】

    举例说明如下图是一个颗二叉树:

    图1一棵二叉树

    上图是一颗二叉树:

    先序遍历(根左右):ABCDEFGHI

    中序遍历(左根右):BDCAEHGIF

    后序遍历(左右根):DCBHIGFEA

     C#代码举例

     一棵简单的二叉树结构

    1     public class BinaryTree
    2     {
    3         public string Value;
    4         public BinaryTree lChild;
    5         public BinaryTree rChild;
    6     }

     先序遍历

    1         //先序遍历-递归实现   //根左右
    2         public static void PreorderTraversal(BinaryTree tree)
    3         {
    4             if (tree == null)
    5                 return;
    6             System.Console.WriteLine(tree.Value);
    7             PreorderTraversal(tree.lChild);
    8             PreorderTraversal(tree.rChild);
    9         }

    中序遍历

     1         //中序遍历-递归实现  //左根右
     2         public static void InorderTraversal(BinaryTree tree)
     3         {
     4             if (tree == null)
     5                 return;
     6 
     7             InorderTraversal(tree.lChild);
     8             System.Console.WriteLine(tree.Value);
     9             InorderTraversal(tree.rChild);
    10         }

    后序遍历

     1         //后序遍历-递归实现 //左右根
     2         public static void PostorderTraversal(BinaryTree tree)
     3         {
     4             if (tree == null)
     5                 return;
     6 
     7             PostorderTraversal(tree.lChild);
     8             PostorderTraversal(tree.rChild);
     9             System.Console.WriteLine(tree.Value);
    10         }

    程序测试

    创建一棵如下图所示的二叉树

     1  /// <summary>
     2         /// 创建一颗二叉树
     3         /// </summary>
     4         /// <returns></returns>
     5         public static BinaryTree CreatBinaryTree()
     6         {
     7             //创建一个tree
     8             BinaryTree tree = new BinaryTree();
     9 
    10             //添加二叉树的值
    11             tree.Value = "A";
    12 
    13             //添加该树左子树
    14             tree.lChild = new BinaryTree()
    15             {
    16                 Value = "B",
    17                 lChild = null,
    18                 rChild = new BinaryTree()
    19                 {
    20                     Value = "C",
    21                     lChild = new BinaryTree()
    22                     {
    23                         Value = "D",
    24                     },
    25                     rChild = null,
    26                 }
    27             };
    28 
    29             //添加该树右子树
    30             tree.rChild = new BinaryTree()
    31             {
    32                 Value = "E",
    33                 lChild = null,
    34                 rChild = new BinaryTree()
    35                 {
    36                     Value = "F",
    37                     lChild = new BinaryTree()
    38                     {
    39                         Value = "G",
    40                         lChild = new BinaryTree() 
    41                         { 
    42                             Value = "H",
    43                             lChild = null,
    44                             rChild = null
    45                         },
    46                         rChild = new BinaryTree()
    47                         {
    48                             Value = "I",
    49                             lChild = null,
    50                             rChild = null
    51             
    52                         }
    53                     },
    54                     rChild = null
    55                 }
    56 
    57             };
    58             return tree;
    59         }

    测试代码

     1         static void Main(string[] args)
     2         {
     3             BinaryTree tree = CreatBinaryTree();
     4 
     5             Console.WriteLine("------------先序遍历------------");
     6             PreorderTraversal(tree);
     7 
     8             Console.WriteLine("------------中序遍历------------");
     9             InorderTraversal(tree);
    10             Console.WriteLine("------------后序遍历------------");
    11             PostorderTraversal(tree);
    12 
    13             Console.Read();
    14         }

    测试结果:

     有了上面的知识储备,那么涉及到二叉树的问题,那基本就有点普了,下面看一道试题(面试的题,具体是哪个公司就不说了,免得大伙百度搜索)

    试题:找出一颗二叉树中是否存在值与某一个值的相等的元素  (记忆里大概是这个意思)

    这就很简单了,实际上就考一个二叉树的遍历,这里写一个先序遍历查找的例子

    查找节点函数

     1         /// <summary>
     2         /// 先序遍历查找二叉树中是否存在某一个值,并返回该元素
     3         /// </summary>
     4         /// <param name="tree"></param>
     5         /// <param name="value"></param>
     6         /// <returns></returns>
     7         public static BinaryTree PreorderTraversalSelectValue(BinaryTree tree, string value)
     8         {
     9             if (tree == null)
    10             {
    11                 return null;
    12             }
    13             if (tree.Value == value)
    14             {
    15                 return tree;
    16             }
    17             //找左子树
    18             BinaryTree node = PreorderTraversalSelectValue(tree.lChild,value);
    19             if (node != null)
    20             {
    21                 return tree;
    22             }
    23             else
    24             {
    25                 //找右子树
    26                 node = PreorderTraversalSelectValue(tree.rChild,value);
    27                 return node;
    28             }
    29         }

    测试代码:

     1   BinaryTree tree2 =  PreorderTraversalSelectValue(tree,"F");
     2            if (tree2 == null)
     3            {
     4                Console.WriteLine("该二叉树中不存在F");
     5            }
     6            else
     7            {
     8                Console.WriteLine("该二叉树中存在值为{0}的元素",tree2.Value);
     9            }
    10            BinaryTree tree3 = PreorderTraversalSelectValue(tree, "J");
    11            if (tree3 == null)
    12            {
    13                Console.WriteLine("该二叉树中不存该元素J");
    14            }
    15            else
    16            {
    17                Console.WriteLine("该二叉树中存在值为{0}的元素", tree3.Value);
    18            }

    程序运行结果:

    有需要源代码工程的可以自己下载

    程序源代码工程下载

    以上是一个面试经历,面试官给的试题,当时我记得用先序遍历做的,用笔写(确实和用VS写感觉是不一样的,O(∩_∩)O哈哈~)自我感觉当时做的并不满意,公司就不给大伙公开了,这是个职业素养问题,免得大伙来百度搜索,为此特意总结出这么一篇来!关于二叉树,这里还有一篇二叉链表存储的博客,喜欢可以去查看!

    二叉树的简单介绍以及二叉树的存储结构

    C#实现二叉树--二叉链表结构

  • 相关阅读:
    python基础:8.正则表达式
    [Unity工具]批量修改字体
    产品理念(微博和Twitter)
    个性化推荐技术漫谈
    谱聚类算法(转自http://www.cnblogs.com/vivounicorn/archive/2012/02/10/2343377.html)
    Ubuntu输入正确密码后无法登录
    KMeans java实现(未用Hadoop版改进)
    Nutch安装指南
    KMeans的MapReduce实现
    特征向量的几何意义
  • 原文地址:https://www.cnblogs.com/JiYF/p/8799694.html
Copyright © 2020-2023  润新知