`

C#实现二叉树(三元素式)及二叉树遍历的四种方法

阅读更多

C#实现二叉树(三元素式)及二叉树遍历的四种方法

using System;
using System.Collections.Generic;
using System.Text;

namespace binaryTree
{
class Program
{
static void Main(string[] args)
{

//用户操作
}
}

//定义: 二叉树的存储结构类
public class Node<T>
{
private T data; //数据域
private Node<T> lChild; //左孩子
private Node<T> rChild; //右孩子

//构造器
public Node(T val, Node<T> lp, Node<T> rp)
{
data = val;
lChild = lp;
rChild = rp;
}

//构造器
public Node(Node<T> lp, Node<T> rp)
{
data = default(T);
lChild = lp;
rChild = rp;
}

//构造器
public Node(T val)
{
data = val;
lChild = null;
rChild = null;
}

//构造器
public Node(T val)
{
data = default(T);
lChild = null;
rChild = null;
}

//数据属性
public T Data
{
get
{
return data;
}
set
{
data = value;
}
}

//左孩子属性
public Node<T> LChild
{
get
{
return lChild;
}
set
{
lChild = value;
}
}

//右孩子属性
public Node<T> RChild
{
get
{
return rChild;
}
set
{
rChild = value;
}
}
}


//不带头结点的二叉树的二叉链表的类 BiTree<T>
public class BiTree<T>
{
private Node<T> head; //头引用

//构造器
public BiTree()
{
head = null;
}

//构造器
public BiTree(T val)
{
Node<T> p = new Node<T>(val);
head = p;
}

//构造器
public BiTree(T val, Node<T> lp, Node<T> rp)
{
Node<T> p = new Node<T>(val, lp, rp);
head = p;
}

//头引用属性
public Node<T> Head
{
get
{
return head;
}
set
{
head = value;
}
}

//判断是否是空二叉树
public bool IsEmpty()
{
if (head == null)
{
return true;
}
else
{
return false;
}
}

//获取根结点
public Node<T> Root()
{
return head;
}

//获取结点的左孩子结点
public Node<T> GetLChild(Node<T> p)
{
return p.LChild;
}

//获取结点的右孩子结点
public Node<T> GetRChild(Node<T> p)
{
return p.RChild;
}

//将结点p的左子树插入值为 val的新结点.
//原来的左子树成为新结点的左子树.
public void InsertL(T val, Node<T> p)
{
Node<T> tmp = new Node<T>(val);
tmp.LChild = p.LChild; //原来的左子树成为新结点的左子树.
p.LChild = tmp; //p的左子孩子为新结点.
}

//将结点p的右子树插入值为 val的新结点,
//原来的右子树成为新结点的右子树.
public void InsertR(T val, Node<T> p)
{
Node<T> tmp = new Node<T>(val);
tmp.RChild = p.RChild; //原来的右子树成为新结点的右子树
p.RChild = tmp; //p的右孩子为新结点
}

//若 p 非空, 删除 p 的左子树
public Node<T> DeleteL(Node<T> p)
{
if(( p==null || (p.LChild==null))
{
return null;
}

Node<T> tmp = p.LChild;
p.LChild=null;

return tmp;
}

//若 p 非空, 删除 p 的右子树
public Node<T> DeleteR(Node<T> p)
{
if ((p == null) || (p.RChild == null))
{
return null;
}

Node<T> tmp = p.RChild;
p.RChild = null;

return tmp;
}

//判断是否是叶子结点
public bool IsLeaf(Node<T> p)
{
if ((p != null) && (p.LChild == null) && (p.RChild == null))
{
return true;
}
else
{
return false;
}
}


//树的遍历: 由于树的定义是递归的, 所以遍历算法也彩递归实现
//原始顺序为: A B C D E F G H I J (原则是 从小到下, 从左到右)
//1.先序遍历(DLR), 思想是: 首先访问根结点, 然后先序遍历其左子树, 最后先遍历其右子树.
//结果是: A B D H I E J C F G
public void PreOrder(Node<T> root)
{
//根结点为空
if (root == null)
{
return;
}

//第一步: 处理根结点
Console.WriteLine("{0}", root.Data);

//第二步: 遍历左子树
PreOrder(root.LChild);

//第三步: 遍历右子树
PreOrder(root.RChild);
}


//中序遍历(LDR), 思想是: 首先中序遍历结点的左子树, 然后访问根结点, 最后中序遍历其右子树
//结果为: H DI B E J E A F C G
public void InOrder(Node<T> root)
{
//根结点为空
if (root == null)
{
return;
}

//中序遍历左子树
InOrder(root.LChild);

//处理根结点,注: 这时的根结点指每一个可以作为父结点的结点.
Console.WriteLine("{0}", root.Data);

//中序遍历右子树.
InOrder(root.RChild);
}


//后序遍历(LRD): 基本思想是: 首先遍历根结点的左子树, 然后后后序遍历根结点的右子树, 最后访问根结点
//结果为: H I D J E B F G C A
public void PostOrder(Node<T> root)
{
//根结点为空
if (root == null)
{
return;
}

//后序遍历左子树
PostOrder(root.LChild);

//后序遍历右子树
PostOrder(root.RChild);

//处理根结点
Console.WriteLine("{0}", root.Data);

}


//(4).层序遍历(Level Order)
//思想: 由于层次遍历结点的顺序是 先遇到的结点先访问, 与队列操作的顺序相同.
//所以, 在进行层次遍历时, 设置一个队列, 将根结点引用入队, 当队列非空时, 循环执行以下三步:
//(1).从队列中取出一个结点引用, 并访问该结点.
//(2).若该结点的左子树非空, 将该结点的左子树引用入队;
//(3).若该结点的右子树非空, 将该结点的右子树引用入队;
public void LevelOrder(Node<T> root)
{
//根结点为空
if (root == null)
{
return;
}

//设置一个队列保存层序遍历的结点
//...此处需要引用到队列的定义类与操作类, 暂略.
}
}

}

分享到:
评论

相关推荐

    二叉树的建立及前中后序遍历

    就是一个 简单的 二叉树的建立及前中后序遍历的 代码

    二叉树 各种遍历算法 C#实现

    在计算机科学中,二叉树遍历是访问二叉树所有节点的一种方法,通常分为三种主要类型:前序遍历、中序遍历和后序遍历。这些遍历方法在解决许多问题时非常有用,如搜索、排序、表达式求值等。本文将详细介绍这三种遍历...

    二叉树的建立和遍历(c#)

    本项目旨在通过用户输入构建二叉树,并实现层次遍历、先序遍历、中序遍历和后序遍历四种常见的遍历方法。其中,至少有一种遍历方式需使用非递归的方式实现。 首先,我们需要定义一个二叉树节点类,包含节点值、左子...

    用递归和非递归算法实现二叉树的三种遍历

    总的来说,这个实验涵盖了二叉树的基础知识,包括二叉链表存储结构、二叉树的构造、以及三种遍历方法的递归和非递归实现。通过这个实验,你可以巩固理论知识,提高编程能力,为后续的高级数据结构和算法学习打下坚实...

    二叉树的遍历方法和递归实现

    ### 二叉树的遍历方法与递归实现详解 #### 一、二叉树的遍历概述 二叉树的遍历是计算机科学中一个基础而重要的概念,它涉及到了对二叉树结构的系统访问策略。遍历的目的在于确保二叉树中的每一个节点都能够被访问...

    C#实现二叉树遍历算法

    接下来,我们实现了四种不同的遍历方法: 1. **先序遍历**(PreOrder):首先访问根节点,然后按照先序遍历左子树,最后遍历右子树。先序遍历的顺序是:根-左-右。在C#代码中,我们通过递归调用`PreOrder&lt;T&gt;`函数...

    C# Windows 遍历二叉树

    这些遍历方法在实现时都遵循特定的访问顺序。 1. 前序遍历(根-左-右): ```csharp void PreOrderTraversal(TreeNode&lt;T&gt; node) { if (node != null) { Console.Write(node.Value + " "); PreOrderTraversal...

    C#实现二叉树基本操作,排序,计算和文件读写

    - **前序、中序、后序遍历**:这三种遍历方法是二叉树计算的基础,可用于计算节点值、打印树结构、执行特定操作等。前序遍历是根-左-右,中序是左-根-右,后序是左-右-根。 - **树的高度、宽度、路径和路径长度**...

    数据结构C#二叉树的基本运算

    在C#中,我们可以定义一个二叉树节点类,包含值、左子节点和右子节点的引用,然后实现以上三种遍历方法。遍历方法对于理解和操作二叉树至关重要,例如在构建表达式树、搜索和排序等任务中。 二叉树的基本运算还包括...

    遍历二叉树的4个非递归算法.rar_binary tree_二叉树_二叉树 非递归 遍历_递归_遍历 CSharp

    二叉树遍历是理解和操作二叉树的关键技能,通常包括三种主要的递归方法:前序遍历、中序遍历和后序遍历,以及一种非递归方法——层次遍历。本资源"遍历二叉树的4个非递归算法.rar"提供了C#语言实现的这四种非递归...

    C语言实现二叉树的后序遍历(递归)

    二叉树的遍历是访问树中所有节点的过程,通常有三种遍历方式:前序遍历、中序遍历和后序遍历。 **后序遍历:** 后序遍历遵循“左-右-根”的顺序,即首先遍历左子树,然后遍历右子树,最后访问根节点。这种遍历方式...

    线索二叉树用c#实现

    线索二叉树是一种特殊的二叉树数据结构,它在二叉链表的基础上增加了线索,用于在非递归情况下实现前序、中序和后序遍历。这种数据结构在计算机科学中尤其在算法和数据结构的学习中具有重要意义,因为它允许我们高效...

    链式二叉树的中序创建、递归中序遍历、非递归堆栈中序遍历、中序销毁

    递归中序遍历是二叉树遍历的一种常见方法。它遵循以下步骤: 1. 如果当前节点为空,则返回。 2. 首先递归遍历左子树。 3. 访问当前节点。 4. 最后递归遍历右子树。 递归中序遍历的核心在于其分治策略,将问题分解为...

    二叉树的遍历 c#版

    本篇文章将深入探讨二叉树的前序遍历、中序遍历和后序遍历这三种主要的遍历方法,并结合C#编程语言进行实现。 1. **前序遍历**: 前序遍历的顺序是:根节点 -&gt; 左子树 -&gt; 右子树。在C#中,可以使用递归或栈来实现...

    二叉树的遍历c#的控制台写得

    二叉树遍历是二叉树操作的核心部分,主要包括前序遍历、中序遍历和后序遍历三种方式。下面我们将详细探讨这三种遍历方法以及如何在C#控制台程序中实现它们。 1. 前序遍历(根-左-右): 前序遍历的顺序是首先访问根...

    数据结构实验报告6-树-二叉树的遍历算法-实验内容及要求.docx

    为了实现上述目标,需要设计一种适合存储二叉树的数据结构。通常情况下,二叉树可以通过链式存储结构来表示,即每个节点包含两个指针域(左子树和右子树)和一个数据域。本实验中,节点的数据域选择字符类型,这意味...

    用c#编写的二叉树的图形化显示

    本项目就是这样一个示例,通过C#实现二叉树的动态绘制,帮助用户理解和分析二叉树的形态。 首先,我们要了解二叉树的基本概念。二叉树是由节点(或称为顶点)和边构成的图,每个节点最多有两个子节点,通常称为左子...

    C# 控制台程序二叉树前中后遍历

    在C#编程中,二叉树是一种非常重要的数据结构,常用于实现各种算法,如搜索、排序等。本文将深入探讨二叉树的前序、中序和后序遍历,以及如何在C#控制台程序中实现这些操作。通过自定义二叉树的结构,我们可以灵活地...

    二叉树和平衡二叉树的C#实现源码

    这里我们将深入探讨这两种数据结构及其C#实现。 首先,二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树的主要操作包括插入、删除和查找。在二叉搜索树(BST,...

    C#用栈的方法写二叉树的前中后序遍历

    在C#编程中,二叉树是一种非常重要的数据结构,常用于实现各种算法和数据组织。二叉树的遍历是其操作的核心部分,通常包括前序遍历、中序遍历和后序遍历。这三种遍历方式各有特点,可以按照不同的顺序访问树中的每个...

Global site tag (gtag.js) - Google Analytics