二叉树遍历 C#

什么是二叉树

  二叉树是每个节点最多有两个子树的树结构
  (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二 叉树。
  (2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
  (3)平衡二叉树——平衡二叉树又被称为AVL树,它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

  二叉数遍历 有 前序遍历、中序遍历、后续遍历,层次遍历、Z型遍历

前期准备工作

  1.定义树的结构

    public class Tree
    {
        public string Value;
        public Tree Left;
        public Tree Right;
    }

  2.创建一颗二叉树

        public static Tree CreatTree()
        {
            Tree tree = new Tree() { Value = "A" };
            tree.Left = new Tree()
            {
                Value = "B",
                Left = new Tree() { Value = "D" },
                Right = new Tree() { Value = "E", Right = new Tree() { Value = "H" } }
            };
            tree.Right = new Tree() { Value = "C", Left = new Tree() { Value = "F" }, Right=new Tree() { Value="G"} };
            return tree;
        }

  树的效果图如下

前序遍历

  前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树
  前序遍历结果 A->B->D->E->H->C->F->G
  C#实现二叉树的前序遍历

        public static void PreOrder(Tree tree)
        {
            Console.Write(tree.Value + "  ");
            if (tree.Left != null)
            {
                PreOrder(tree.Left);
            }
            if (tree.Right != null)
            {
                PreOrder(tree.Right);
            }
        }

中序遍历

  中序遍历也叫做中根遍历、中序周游,遍历方式是先左后根再右

  中序遍历结果 D->B->E->H->A->F->C->G

  看代码

       public static void InOrder(Tree tree)
        {
            if (tree.Left != null)
            {
                InOrder(tree.Left);
            }
            Console.Write(tree.Value + "  ");
            if (tree.Right != null)
            {
                InOrder(tree.Right);
            }
        }  

后续遍历

  后续遍历也叫做后根遍历、后序周游,可记做左右根。先左后右再根。巧记:左右根。
  后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点
  后序遍历结果 D->H->E->B->F->G->C->A
  看代码

        public static void InOrder(Tree tree)
        {
            if (tree.Left != null)
            {
                InOrder(tree.Left);
            }
            Console.Write(tree.Value + "  ");
            if (tree.Right != null)
            {
                InOrder(tree.Right);
            }
        }

层次遍历

  层次遍历就是按照树的层次从上到下进行输出,层次遍历我们可以借助队列的先进先出
  看代码

       public static void LevelOrder(Tree tree)
        {
            var queue = new Queue<Tree>();
            queue.Enqueue(tree);
            while (queue.Any())
            {
                var item = queue.Dequeue();
                Console.Write(item.Value);
                if (item.Left != null)
                {
                    queue.Enqueue(item.Left);
                }
                if (item.Right != null)
                {
                    queue.Enqueue(item.Right);
                }
            }
        }

二叉树遍历 C#的更多相关文章

  1. C++ 二叉树遍历实现

    原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...

  2. python实现二叉树遍历算法

    说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...

  3. 【二叉树遍历模版】前序遍历&amp;&amp;中序遍历&amp;&amp;后序遍历&amp;&amp;层次遍历&amp;&amp;Root-&gt;Right-&gt;Left遍历

    [二叉树遍历模版]前序遍历     1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...

  4. hdu 4605 线段树与二叉树遍历

    思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...

  5. poj2255 (二叉树遍历)

    poj2255 二叉树遍历 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Descripti ...

  6. D - 二叉树遍历(推荐)

    二叉树遍历问题 Description   Tree Recovery Little Valentine liked playing with binary trees very much. Her ...

  7. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  8. 二叉树遍历(flist)(二叉树,已知中序层序,求先序)

    问题 C: 二叉树遍历(flist) 时间限制: 1 Sec  内存限制: 128 MB提交: 76  解决: 53[提交][状态][讨论版][命题人:quanxing][Edit] [TestDat ...

  9. 二叉树遍历(flist)(已知中序和按层遍历,求先序 )

    问题 F: 二叉树遍历(flist) 时间限制: 1 Sec  内存限制: 128 MB提交: 11  解决: 9[提交][状态][讨论版][命题人:quanxing][Edit] [TestData ...

随机推荐

  1. struts中Cookie实现记住密码

    HttpServletRequest request = ServletActionContext.getRequest(); Cookie[] cookies = request.getCookie ...

  2. java线程控制、状态同步、volatile、Thread.interupt以及ConcurrentLinkedQueue

    在有些严格的系统中,我们需要做到干净的停止线程并清理相关状态.涉及到这个主题会带出很多的相关点,简单的总结如下: 我们知道,在java中,有一个volatile关键字,其官方说明(https://do ...

  3. java中移位运算符:&lt;&lt;、&gt;&gt;和&gt;&gt;&gt;之间的比较

    一.说明 <<:运算符将二进制位进行左移操作 >>:运算符将二进制位进行右移操作 >>>:运算符将用0填空高位 二.举例 /** * *----------c ...

  4. 再谈php乱码问题

    在开博不久,写了一篇关于解决php乱码问题文章,php 解决乱码的通用方法,绝大部分乱码,这篇博文都可以解决,但是也有例外. 如果有人传参数给你,你根本不知道,传给你的参数到底是什么编码,这个时候该怎 ...

  5. Struts2第六篇【文件上传和下载】

    前言 在讲解开山篇的时候就已经说了,Struts2框架封装了文件上传的功能--..本博文主要讲解怎么使用Struts框架来完成文件上传和下载 回顾以前的文件上传 首先,我们先来回顾一下以前,我们在we ...

  6. python源码为何都是pass

    最近看Python代码  按照一个函数递进的看下去,最后发现,遇到很多源码什么逻辑都没写,仅仅以一个pass  结尾          但却能得到应该得到的结果,这点真的很奇怪,上网查找后 觉得下面的 ...

  7. C#开发微信支付之企业向用户付款

    1.企业付款的介绍 所谓企业付款指的是,在功能开放后诸如保险行业的客户理赔.退保.商品退款.发放征集活动奖金.抽奖互动等操作都可以通过企业付款完成.而此前,微信支付只能提供客户向企业单向付款. 商户如 ...

  8. oracle命令1

    基础查询  查询当前用户 show user; 查询当前用户下的表 select * from tab; 清屏 host cls: clear; --查询所有的员工信息 select * from e ...

  9. Error:不能将&quot;char*&quot;类型的值分配到&quot;LPSTR&quot;类型的实体 也许 &quot;char*&quot;类型的实参与&quot;LPCWSTR&quot;类型的形参不兼容

    http://www.myexception.cn/ruby-rails/1876106.html 选择“XXX项目”->“属性”->“配置属性”->“常规”选项中,把“使用 Uni ...

  10. 黄聪:V2010中C#实现友好的等待任务完成时,出现的多线程悬浮窗体

    实现效果如下: 项目已经打包后,大家直接下载吧:[HCWaitForm.rar]