二叉树遍历 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);
}
}

层次遍历

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

  层次遍历结果A->B->C->D->E->F->G->H
  看代码

       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);
}
}
}

Z型层次遍历

  Z型层次遍历即按照奇数层由左到右的遍历方式、偶数层按照由右到左的遍历方式

  Z型遍历输出结果A->C->B->D->E->F->G->H

  针对Z行遍历我们可以使用2个栈,来记录奇数层的输出和偶数层的输出,由于栈是先进后出,需要注意入栈的顺序

  看代码

        public static void ZOrder(Tree tree)
{
Stack<Tree> stack1 = new Stack<Tree>();
Stack<Tree> stack2 = new Stack<Tree>();
stack1.Push(tree);
while (stack1.Any() || stack2.Any())
{
while (stack1.Any())
{
var item = stack1.Pop();
Console.Write(item.Value + " ");
if (item.Left != null)
{
stack2.Push(item.Left);
}
if (item.Right != null)
{
stack2.Push(item.Right);
}
}
while (stack2.Any())
{
var item = stack2.Pop();
Console.Write(item.Value + " ");
if (item.Right != null)
{
stack1.Push(item.Right);
}
if (item.Left != null)
{
stack1.Push(item.Left);
}
}
}
}

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

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

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

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

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

  3. 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->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. XJOIWinterCampPrecontest1-P2队列

    2 排队2.1 题目有n 个人打水,第i 个人打水需要ai 的时间.有K 个水龙头,你可以随意安排他们打水的顺序以及使用哪一个水龙头,但是每一时刻每一个水龙头只能有一个人使用且一个人一旦开始打水就不能 ...

  2. XJOI1424解压字符串

    解压字符串 给你一个字符串S,S是已经被加密过的字符串.现在要求你把字符串S还原.字符串S可能会出现这样的格式:k(q),它表示字符串q重复了k次,其中q是0个或多个字符,而k是一个数字,范围是0至9 ...

  3. 记录一次raid数据恢复及回迁成功的案例

    故障发生在两块盘组成的一个raid0上,其中的一块盘亮黄灯,被raid卡踢出后,raid崩溃,下面就把当时抢救数据的整个过程进行介绍. 由于硬盘是两块SAS 300G的硬盘,先把硬盘从机器中拔出来,然 ...

  4. (转)Java线程面试题 Top 50

    原文链接:http://www.importnew.com/12773.html   本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末 ...

  5. 在ElasticSearch中使用 IK 中文分词插件

    我这里集成好了一个自带IK的版本,下载即用, https://github.com/xlb378917466/elasticsearch5.2.include_IK 添加了IK插件意味着你可以使用ik ...

  6. 1145: 零起点学算法52——数组中删数II

    1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 293 ...

  7. 易汇金在线支付接口实例。ecshop和shopex,shopnc,iwebshop下完美无错(最新)

    最近为客户的一个在线商城做了一个易汇金在线支付的接口.跟大家分享一下. 1 首先可以模仿其他的接口,比如支付宝,财付通等的接口,构建模块功能文件和语言文件. 功能模块构建: /includes/mod ...

  8. mpush 服务器环境配置安装 CentOS 7 and Windows

    github-doc https://github.com/mywiki/mpush-doc/blob/master/SUMMARY.md Introduction 1.服务器环境 2.安装Redis ...

  9. webpack 打包成功,但是css不起作用

    问题: webpack 打包成功,但是css不起作用 问题分析/解决: 原因有以下几种 使用了webpack2的语法规则不正确; webpack2要求必须写-loader; 可能是只写了css-loa ...

  10. 几个地图(高德、百度、Apple、Google)URL API

    移动应用中,如何在自己的App中调起第三方的原生地图App,并显示相关的信息,如显示指定的一个坐标位置,显示一个起点到终点的路线查询,等等. 目前几个主要的地图商都提供了自己的App通过URL调用的形 ...