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

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

 /// <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. python开发基础(二)运算符以及数据类型之str(字符串)

    # encoding: utf-8 # module builtins # from (built-in) # by generator 1.147 """ Built- ...

  2. 力扣 - 232. 用栈实现队列.md

    目录 题目 思路 代码实现 复杂度分析 题目 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列的支持的所有操作(push.pop.peek.empty): 实现 MyQueue 类: void ...

  3. Sublime Text 3 安装插件与快捷键总结

    ublime Text 3 是一个了不起的软件.首先,它是一个干净,实用,可以快速的编写代码编辑器.它不仅具有令人难以置信的内置功能(多行编辑和VIM模式),而且还支持插件,代码片段和其他许多东西.很 ...

  4. mysql中key和index的关系

    原文链接:https://blog.csdn.net/top_code/article/details/50599840

  5. 预训练模型——开创NLP新纪元

    预训练模型--开创NLP新纪元 论文地址 BERT相关论文列表 清华整理-预训练语言模型 awesome-bert-nlp BERT Lang Street huggingface models 论文 ...

  6. Java基础 之三 继承

    1.子类 1) 定义子类 //假设父类(也叫做超类)是Employee类,用extends来表示继承 public class Manager extends Employee{ //域和方法 pri ...

  7. ThreadLocal应用及源码分析

    ThreadLocal 基本使用 ThreadLocal 的作用是:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传 ...

  8. Collectors工具类

    Collector是专门用来作为Stream的collect方法的参数的:而Collectors是作为生产具体Collector的工具类. Collectors是一个工具类,是JDK预实现Collec ...

  9. webpack : 无法加载文件 C:\Users\Eileen\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本

    报错内容: webpack : 无法加载文件 C:\Users\Eileen\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本.有关详细信息,请参阅 http ...

  10. js前端读取文件内容

    方法1:原生 <input type="file" name="file" id="file" onchange="jsRe ...