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);
}
}
分享到:
相关推荐
遍历二叉树是访问树中所有节点的过程,通常有三种基本的遍历方法:前序遍历(Preorder Traversal)、中序遍历(Inorder Traversal)和后序遍历(Postorder Traversal)。这些遍历方法在C#编程中有着广泛的应用,如...
递归中序遍历是二叉树遍历的一种常见方法。它遵循以下步骤: 1. 如果当前节点为空,则返回。 2. 首先递归遍历左子树。 3. 访问当前节点。 4. 最后递归遍历右子树。 递归中序遍历的核心在于其分治策略,将问题分解为...
在这个场景中,我们将讨论如何利用二叉树的数据结构来实现无限级分类,并重点探讨一种改进的前序遍历算法。 二叉树是最基本的树形数据结构之一,每个节点最多有两个子节点,分为左子节点和右子节点。在二叉树中,...
二叉树的几种操作,包括递归先序建立二叉树、先序遍历、中序遍历、后序遍历、非递归的各种遍历、计算叶子节点数目和所有节点数目,使用队列实现二叉树的层次遍历.zip
二叉树的遍历是理解和操作二叉树的关键,主要分为三种方式:前序遍历、中序遍历和后序遍历。在给定的代码中,我们关注的是如何根据前序遍历(Preorder Traversal)和中序遍历(Inorder Traversal)的结果来重建一棵...
二叉树遍历是理解和操作二叉树的关键技能,通常包括三种主要的递归方法:前序遍历、中序遍历和后序遍历,以及一种非递归方法——层次遍历。本资源"遍历二叉树的4个非递归算法.rar"提供了C#语言实现的这四种非递归...
然后是遍历二叉树,常见的遍历方法有前序遍历、中序遍历和后序遍历。这些遍历方法在实现时都遵循特定的访问顺序。 1. 前序遍历(根-左-右): ```csharp void PreOrderTraversal(TreeNode<T> node) { if (node != ...
在计算机科学中,二叉树遍历是访问二叉树所有节点的一种方法,通常分为三种主要类型:前序遍历、中序遍历和后序遍历。这些遍历方法在解决许多问题时非常有用,如搜索、排序、表达式求值等。本文将详细介绍这三种遍历...
以上就是使用C#栈方法进行二叉树前序、中序和后序遍历的详细解释。在实际编程中,可以将这些方法填充完整,以完成对二叉树的遍历。这种方法避免了递归,对于深度较大的二叉树,可以减少函数调用的开销,提高性能。...
本篇文章将深入探讨二叉树的前序遍历、中序遍历和后序遍历这三种主要的遍历方法,并结合C#编程语言进行实现。 1. **前序遍历**: 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。在C#中,可以使用递归或栈来实现...
二叉树的遍历是访问树中所有节点的过程,通常有三种遍历方式:前序遍历、中序遍历和后序遍历。 **后序遍历:** 后序遍历遵循“左-右-根”的顺序,即首先遍历左子树,然后遍历右子树,最后访问根节点。这种遍历方式...
二叉树遍历是二叉树算法中的核心部分,它主要包括三种主要方法:前序遍历、中序遍历和后序遍历。这些遍历方法有各自的用途,例如复制树、打印树结构或进行特定的搜索操作。 1. **前序遍历**:这是最基本的遍历方式...
二叉树通常分为三种遍历方式:前序遍历、中序遍历和后序遍历。 1. 前序遍历:首先访问根节点,然后遍历左子树,最后遍历右子树。 2. 中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树。 3. 后序遍历:...
二叉树及其遍历实验报告代码 关于二叉树的创建,前序遍历,中序遍历,后序遍历,横向打印二叉树。 采用AB##C##方式输入,#代表(左or右)子树为空
`:用后序遍历算法遍历二叉树。 - `intLayerTraval(BiTree bt);`:层次遍历二叉树。 - `intinitQueue(BiTreeQueue bt_queue);`:初始化循环队列。 - `intenQueue(const BiTreeQueue Q, BiTree bt);`:二叉树节点入队...
二叉树遍历序列.cpp
本篇我们将讨论如何根据先序遍历和中序遍历来重建一个二叉树,并通过C#编程语言实现这一过程。 先序遍历(Preorder Traversal)的顺序是:根节点 -> 左子树 -> 右子树。中序遍历(Inorder Traversal)的顺序是:左...
除了递归方法,还可以使用栈来实现非递归的二叉树遍历,这种方法称为迭代。例如,前序遍历的迭代实现可以借助一个栈来辅助: 1. 将根节点压入栈。 2. 当栈不为空时,弹出栈顶节点并访问,然后将其右子节点和左子...