using System.Collections.Generic;
using System.Collections;
class BiTree
{
public BiTree leftChild;
public BiTree rightChild;
public object Data;
public BiTree(object aData)
{
Data = aData;
}
}
class TestUtil
{
public static void Main()
{
BiTree root = new BiTree("1");
BiTree n1 = new BiTree("2");
BiTree n2 = new BiTree("3");
BiTree n3 = new BiTree("4");
BiTree n4 = new BiTree("5");
BiTree n5 = new BiTree("6");
BiTree n6 = new BiTree("7");
root.leftChild = n1;
root.rightChild = n2;
n1.leftChild = n3;
n1.rightChild = n4;
n2.leftChild = n5;
n2.rightChild = n6;
//PreTravelCur(root);
Console.WriteLine("中序:");
MidTravelStack(root);
Console.WriteLine("前序:");
PreTravelStack(root);
Console.WriteLine("后序:");
LastTravelStack(root);
Console.Read();
}
/// <summary>
/// 前序遍历,递归
/// </summary>
/// <param name="tree"></param>
public static void PreTravelCur(BiTree tree)
{
if (tree != null)
{
Console.WriteLine(tree.Data);
PreTravelCur(tree.leftChild);
PreTravelCur(tree.rightChild);
}
}
/// <summary>
/// 中序遍历
/// </summary>
/// <param name="tree"></param>
public static void MidTravelStack(BiTree tree)
{
if (tree == null)
{
return;
}
Stack<object> stack = new Stack<object>();
BiTree p = tree;
do
{
while (p != null)
{
stack.Push(p);
p = p.leftChild;
}
p =(BiTree) stack.Pop();
Console.WriteLine(p.Data);
p = p.rightChild;
} while (stack.Count > 0|| p != null);
}
/// <summary>
/// 前序遍历
/// </summary>
/// <param name="tree"></param>
public static void PreTravelStack(BiTree tree)
{
if (tree == null)
return;
Stack<object> stack = new Stack<object>();
BiTree p = tree;
do
{
while (p != null)
{
Console.WriteLine(p.Data);
stack.Push(p);
p = p.leftChild;
}
p = (BiTree)stack.Pop();
p = p.rightChild;
} while (stack.Count > 0 || p != null);
}
/// <summary>
/// 要用两个栈,比前两种复杂
/// </summary>
/// <param name="tree"></param>
public static void LastTravelStack(BiTree tree)
{
if (tree == null)
return;
//放访问过的节点
Stack<BiTree> stack1 = new Stack<BiTree>();
//放节点是否访问过 标志
Stack<bool> stackFlag = new Stack<bool>();
BiTree p=tree;
do
{
while (p != null)
{
stack1.Push(p);
stackFlag.Push(false);
p = p.leftChild;
}
p = stack1.Pop();
bool flag = stackFlag.Pop();
//第一次访问
if (!flag)
{
stack1.Push(p);
stackFlag.Push(true);
p = p.rightChild;
}//第二次访问
else
{
Console.WriteLine(p.Data);
p = null;
}
}
//栈不为空 或者 指针不为空
while (stack1.Count > 0 || p != null);
}
}
分享到:
相关推荐
主要介绍了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法,涉及C#遍历二叉树的相关技巧,需要的朋友可以参考下
无限级分类----改进前序遍历树 二叉树 c# 无限极分类 前序遍历树
二叉树的几种操作,包括递归先序建立二叉树、先序遍历、中序遍历、后序遍历、非递归的各种遍历、计算叶子节点数目和所有节点数目,使用队列实现二叉树的层次遍历.zip
一个用C#写的简单的二叉树,可以创建、前序遍历、中序遍历、后续遍历。Windows 窗体应用程序。
二叉树及其遍历实验报告代码 关于二叉树的创建,前序遍历,中序遍历,后序遍历,横向打印二叉树。 采用AB##C##方式输入,#代表(左or右)子树为空
二叉树遍历序列.cpp
就是一个 简单的 二叉树的建立及前中后序遍历的 代码
二叉树的建立与遍历 源代码;用两种方案建立,用多种遍历方法输出;完整的应用程序
二叉树 各种遍历算法 C#实现
static void Main(string[] args) { nodes<string> root... Console.WriteLine("中序遍历方法遍历二叉树:"); MidOrder(rootNode); Console.WriteLine("后序遍历方法遍历二叉树:"); AfterOrder(rootNode);
本文实例讲述了C#非递归先序遍历二叉树的方法。分享给大家供大家参考。具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; ...
(1)能够输入二叉树的各个结点,建立二叉树; (2)按层序、先序、中序、后序遍历序列输出二叉树(要求至少其中一个遍历方法用非递归实现)。
实现了二叉树的建立、前中后序遍历的非递归实现,有可执行文件,直接运行即可。
自己写的一个小小测试,可以三种方式遍历二叉树,你可以自己建立二叉树进行测试
(2) 前序遍历“根节点”的左子树 (3) 前序遍历“根节点”的右子树 其中根节点可以直接访问,对于左子树和右子树又可以将他们看成由三部分组成,再次分别遍历他们的三部分。这也就是通过递归对它们经行遍历,不同...
数据结构二叉树实现二叉树的遍历先中后序,二叉树的基本运算,计算结点数,实现二叉树的复制,求二叉树的最大值和最小值,求二叉树中所有根结点到叶子结点的路径,判断两颗二叉树的相似性...
线索二叉树的实现 C#实现 线索二叉树的实现 C#实现