C#数据结构-二叉树-顺序存储结构
什么是二叉树:每个树的节点只有两个子树的树形结构。
为什么使用顺序存储结构:使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号,从而对这些结点进行访问,这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法。
/// <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#数据结构-二叉树-顺序存储结构的更多相关文章
- ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)
二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是 ...
- 【PHP数据结构】完全二叉树、线索二叉树及树的顺序存储结构
在上篇文章中,我们学习了二叉树的基本链式结构以及建树和遍历相关的操作.今天我们学习的则是一些二叉树相关的概念以及二叉树的一种变形形式. 完全二叉树 什么叫完全二叉树呢?在说到完全二叉树之前,我们先说另 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
- 【Java】 大话数据结构(1) 线性表之顺序存储结构
本文根据<大话数据结构>一书,实现了Java版的顺序存储结构. 顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素,一般用一维数组来实现. 书中的线性表抽象数据类型定义如 ...
- 大话数据结构(五)(java程序)——顺序存储结构的插入与删除
获得元素操作 对于线性表的顺序存储结构来说,我们要实现getElement操作,即将线性表的第i个位置元素返回即可 插入操作 插入算法思路: 1.如果插入位置不合理,抛出异常 2.如果插入表的长度大于 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...
- 数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析
#include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初 ...
- 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现
逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...
- c语言数据结构之线性表的顺序存储结构
线性表,即线性存储结构,将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构,简称线性表. 注意:使用线性表存储的数据,要求数据类型必须一致,线性表存储的数据,要么全不 ...
随机推荐
- Mybatis日记
SqlSession build: ExecutorType :SIMPLE ,REUSE, BATCH, SIMPLE 为默认执行器: REUSE 为可重用执行器,重用Statement,执行器会缓 ...
- 【SpringBoot】06.SpringBoot访问静态资源
SpringBoot访问静态资源 1.SpringBoot从classpath/static的目录 目录名称必须是static 启动项目,访问http://localhost:8080/0101.jp ...
- JavaScript的原型对象prototype、原型属性__proto__、原型链和constructor
先画上一个关系图: 1. 什么是prototype.__proto__.constructor? var arr = new Array; 1. __proto__是原型属性,对象特有的属性,是对象指 ...
- 快速了解阿里微服务热门开源分布式事务框架——Seata
一.Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来. Seata 是 ...
- sqlserver with(NOLOCK) 或 with(READPAST)
https://blog.csdn.net/shuicaohui5/article/details/6758868
- CSS动画animation
transition: 过渡动画transition-property: 属性transition-duration: 间隔transition-timing-function: 曲线transiti ...
- Netlink 内核实现分析 1
Netlink 是一种IPC(Inter Process Commumicate)机制,它是一种用于内核与用户空间通信的机制,在一般情况下,用户态和内核态通信会使用传统的Ioctl.sysfs属性文件 ...
- c++函数声明的位置对函数重载的影响
c++为了兼容c,也是采用(假)单遍编译.这特别影响函数重载决议(当c++编译器读到一个函数调用语句时,它必须从目前已看到的同名函数中选出最佳函数,哪怕后面的代码中出现了更合适的匹配) 1 #incl ...
- 02、MyBatis XML 全局配置文件
MyBatis-全局配置文件 在MyBatis中全局配置文件有着重要的地位,里面有9类行为信息;如果我们要想将MyBatis运用的熟练,配置全局配置文件是必不可少的步骤,所以我们一定要啃下这一块硬骨头 ...
- dpkg 批量卸载
dpkg -l |grep deepin|awk '{print $2}'|xargs sudo dpkg -P