什么是二叉树:每个树的节点只有两个子树的树形结构。

为什么使用顺序存储结构:使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号,从而对这些结点进行访问,这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法。

 /// <summary>
/// 顺序存储二叉树
/// </summary>
public class SequentialStorageBinaryTree<T>
{
/// <summary>
/// 用于存储节点的数组
/// </summary>
private T[] data;
/// <summary>
/// 节点数
/// </summary>
private int count; public SequentialStorageBinaryTree(T[] arr = null)
{
if (arr == null)
data = new T[0];
else
data = arr;
count = data.Length;
} /// <summary>
/// 增加
/// </summary>
/// <param name="item"></param>
public bool Add(T item)
{
List<T> list = data.ToList<T>();
list.Add(item);
data = list.ToArray();
count = data.Length;
return true;
}
}

通过数组存储结构为:

1、层次遍历

/// <summary>
/// 层次遍历
/// </summary>
public void LevelTraversal()
{
for (int i = 0; i < count; i++)
{
Console.Write(data[i] + " ");
}
}

2、先序遍历

/// <summary>
/// 先序遍历
/// </summary>
/// <param name="index"></param>
public void PreorderTraversal(int index =0)
{
//递归的终止条件
if (index >= count || index <0)
return;
int number = index + 1;
Console.Write(data[index] + " ");
int leftIndex = number * 2;//做节点
int rightIndex = number * 2 + 1;
PreorderTraversal(leftIndex - 1);
PreorderTraversal(rightIndex - 1);
}

3、中序遍历

/// <summary>
/// 中序遍历
/// </summary>
/// <param name="index"></param>
public void MiddlePrefaceTraversal(int index = 0)
{
//递归的终止条件
if (index >= count || index < 0)
return;
int number = index + 1; int leftIndex = number * 2;//做节点
int rightIndex = number * 2 + 1;
MiddlePrefaceTraversal(leftIndex - 1);
Console.Write(data[index] + " ");
MiddlePrefaceTraversal(rightIndex - 1);
}

4、后续遍历

/// <summary>
/// 后序遍历
/// </summary>
/// <param name="index"></param>
public void AfterwordTraversal(int index = 0)
{
//递归的终止条件
if (index >= count || index < 0)
return;
int number = index + 1;
int leftIndex = number * 2;//做节点
int rightIndex = number * 2 + 1;
AfterwordTraversal(leftIndex - 1);
AfterwordTraversal(rightIndex - 1);
Console.Write(data[index] + " ");
}

现在我们测试下:

SequentialStorageBinaryTree<string> bTree = new SequentialStorageBinaryTree<string>();
bTree.Add("A");
bTree.Add("B");
bTree.Add("C");
bTree.Add("D");
bTree.Add("E");
bTree.Add("F");
bTree.Add("G"); //先序遍历
Console.Write("先序遍历:");
bTree.PreorderTraversal();
Console.WriteLine(); //中序遍历
Console.Write("中序遍历:");
bTree.MiddlePrefaceTraversal();
Console.WriteLine(); //中序遍历
Console.Write("后序遍历:");
bTree.AfterwordTraversal();
Console.WriteLine(); //层次遍历
Console.Write("层次遍历:");
bTree.LevelTraversal();
Console.ReadKey();

输出:


C#数据结构-二叉树-顺序存储结构的更多相关文章

  1. ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)

    二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是 ...

  2. 【PHP数据结构】完全二叉树、线索二叉树及树的顺序存储结构

    在上篇文章中,我们学习了二叉树的基本链式结构以及建树和遍历相关的操作.今天我们学习的则是一些二叉树相关的概念以及二叉树的一种变形形式. 完全二叉树 什么叫完全二叉树呢?在说到完全二叉树之前,我们先说另 ...

  3. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

  4. 【Java】 大话数据结构(1) 线性表之顺序存储结构

     本文根据<大话数据结构>一书,实现了Java版的顺序存储结构. 顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素,一般用一维数组来实现. 书中的线性表抽象数据类型定义如 ...

  5. 大话数据结构(五)(java程序)——顺序存储结构的插入与删除

    获得元素操作 对于线性表的顺序存储结构来说,我们要实现getElement操作,即将线性表的第i个位置元素返回即可 插入操作 插入算法思路: 1.如果插入位置不合理,抛出异常 2.如果插入表的长度大于 ...

  6. [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...

  7. 数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析

    #include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初 ...

  8. 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  9. c语言数据结构之线性表的顺序存储结构

    线性表,即线性存储结构,将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构,简称线性表. 注意:使用线性表存储的数据,要求数据类型必须一致,线性表存储的数据,要么全不 ...

随机推荐

  1. Mybatis的基础配置

    mybatis相关配置 mybatis核心文件配置的用法以及事例(初级) properties标签:获取外部的配置文件 <properties resource="jdbc.prope ...

  2. 【原创】Linux虚拟化KVM-Qemu分析(五)之内存虚拟化

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

  3. CF716D Complete The Graph

    图论+构造 首先可以发现如果去除了可以改变权值的边,$s$到$t$的最短路若小于$l$,那么一定不行 若等于则直接将可改边权的边改为inf,输出即可 那么现在原图中的最短路是大于$l$的 因为每一条边 ...

  4. 【Kata Daily 190924】Difference of Volumes of Cuboids(长方体的体积差)

    题目: In this simple exercise, you will create a program that will take two lists of integers, a and b ...

  5. ci框架根据配置自动生成controller控制器和model控制器(改版本)

    CI修改如下: if($modle_file=config_item('modle_file')) { if ($modle_file === TRUE) { $modle_file=config_i ...

  6. ubuntu18.04 安装RabbitVCS

    因为仓库安装一直安装不上所以手动安装 第一步:下载 https://github.com/rabbitvcs/rabbitvcs/ 安装 解压安装 python setup.py install -- ...

  7. 使用Graph API 操作OneDrive 文件 权限 共享

    (Get)列出默认驱动器下(获取items id) /me/drive/root/children 如果想找其他驱动器使用/Drives 列出后可以查看到驱动器下的文件,其中items id就是文件的 ...

  8. 记录一次读取hdfs文件时出现的问题java.net.ConnectException: Connection refused

    公司的hadoop集群是之前的同事搭建的,我(小白一个)在spark shell中读取hdfs上的文件时,执行以下指令 >>> word=sc.textFile("hdfs ...

  9. css类名的使用

    ` Document .box { color: rgba(255, 0, 0, 1) } .box .box2 { color: rgba(0, 128, 0, 1) } .box.box2 { c ...

  10. HotSpot类模型之InstanceKlass

    上一篇 HotSpot源码分析之类模型 介绍了类模型的基础类Klass的重要属性及方法,这一篇介绍一下InstanceKlass及InstanceKlass的子类. 1.InstanceKlass类 ...