二叉树遍历 C#
二叉树遍历 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#的更多相关文章
- C++ 二叉树遍历实现
原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...
- python实现二叉树遍历算法
说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...
- 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历
[二叉树遍历模版]前序遍历 1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...
- hdu 4605 线段树与二叉树遍历
思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...
- poj2255 (二叉树遍历)
poj2255 二叉树遍历 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descripti ...
- D - 二叉树遍历(推荐)
二叉树遍历问题 Description Tree Recovery Little Valentine liked playing with binary trees very much. Her ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- 二叉树遍历(flist)(二叉树,已知中序层序,求先序)
问题 C: 二叉树遍历(flist) 时间限制: 1 Sec 内存限制: 128 MB提交: 76 解决: 53[提交][状态][讨论版][命题人:quanxing][Edit] [TestDat ...
- 二叉树遍历(flist)(已知中序和按层遍历,求先序 )
问题 F: 二叉树遍历(flist) 时间限制: 1 Sec 内存限制: 128 MB提交: 11 解决: 9[提交][状态][讨论版][命题人:quanxing][Edit] [TestData ...
随机推荐
- 老李分享:Python开发性能测试脚本
老李分享:Python开发性能测试脚本 测试开发工程师的工作主要是根据测试目标来完成,帮助测试人员完成测试目标,测试的业务需求是测试人员提出,但是由于环境的制约,手中没有性能测试工具的时候,性能测 ...
- 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 4
这一部分的代码逻辑关系是这样的: 344行: 一个外部循环每次从上次保存下来的设备列表获得一个设备Device实例 350行: 再在一个内部循环从最新的设备列表中获得一个设备Device实例 353行 ...
- 手机自动化测试:Appium源码分析之跟踪代码分析七
手机自动化测试:Appium源码分析之跟踪代码分析七 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...
- vuejs学习笔记(1)--属性,事件绑定,ajax
属性 v-for 类似于angular中的 ng-repeat ,用于重复生成html片段: <ul id="box"> <li v-for="(v, ...
- Myeclipse8.5开发-插件安装二:安装findbugs方法
环境:Myeclipse8.5 step 1:首先从官网下载findbugs插件:http://downloads.sourceforge.net/project/findbugs/findbugs% ...
- Maven基础学习(一)—Maven入门
一.概述 Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管 ...
- 课堂博客-----TreeView+++++XML形成博客
什么是XML? 解析:XML:Extensible Markup Language(可扩展标记语言) HTML:HyperLink Text Markup Language(超文本标记语言) xml ...
- ios 网络/本地播放器
推荐播放器: LRLAVPlayer相对易懂好修改,调整添加内容. https://github.com/codeWorm2015/videoPlayer NSString*path=[[NSBund ...
- JavaEE开发之SpringMVC中的路由配置及参数传递详解
在之前我们使用Swift的Perfect框架来开发服务端程序时,聊到了Perfect中的路由配置.而在SpringMVC中的路由配置与其也是大同小异的.说到路由,其实就是将URL映射到Java的具体类 ...
- Eclipse默认编码设置
eclipse 默认编码居然是GBK,js文件默认编码是ISO-....怎么可以这样呢?都修改成UTF8的方法:1.windows->Preferences...打开"首选项" ...