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语言数据结构之线性表的顺序存储结构
线性表,即线性存储结构,将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构,简称线性表. 注意:使用线性表存储的数据,要求数据类型必须一致,线性表存储的数据,要么全不 ...
随机推荐
- [论文阅读] RNN 在阿里DIEN中的应用
[论文阅读] RNN 在阿里DIEN中的应用 0x00 摘要 本文基于阿里推荐DIEN代码,梳理了下RNN一些概念,以及TensorFlow中的部分源码.本博客旨在帮助小伙伴们详细了解每一步骤以及为什 ...
- vim实现CTRL+S为保存快捷键
用vim正撸代码撸的飞起,突然Xshell就掉线了,真是太蛋疼了. 于是开始怀念起vs下撸代码时随时随地ctrl+s保存的快捷键,百度了一下,网上的vim实现ctrl+s保存的快捷键设置都有问题,自己 ...
- leetcode128-generate-parentheses
题目描述 给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合. 例如,给出n=3,解集为: "((()))", "(()())", "( ...
- knn-demo
from __future__ import print_functionfrom numpy import *# 导入科学计算包numpy和运算符模块operatorimport operatorf ...
- 2Git分支问题
1,查看所有分支: git branch *号在哪表明当前分支在哪. 2,新建一个分支: git branch featureq(分支名) 转到该分支下: git checkout featureq ...
- 我画着图,FluentAPI 她自己就生成了
在 Newbe.ObjectVistor 0.3 版本中我们非常兴奋的引入了一个紧张刺激的新特性:使用状态图来生成任意给定的 FluentAPI 设计. 开篇摘要 在非常多优秀的框架中都存在一部分 F ...
- ceph的jewel新支持的rbd-nbd
jewel版本新增加了一个驱动NBD,允许librbd实现一个内核级别的rbd NBD相比较于kernel rbd: rbd-ko是根据内核主线走的,升级kernel rbd需要升级到相应的内核,改动 ...
- 理解 ASP.NET Core: 验证
ASP.NET Core 验证 通常在应用程序中,安全分为前后两个步骤:验证和授权.验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源. 既然安全从验证开始 ...
- 利用分块传输绕WAF
分块传输原理介绍 背景 HTTP Connection有两种连接方式:短连接和长连接: 短连接即一次请求对应一次TCP连接的建立和销毁过程. 长连接是多个请求共用同一个连接这样可以节省大量连接建立时间 ...
- centos8 连接wifi
从官网下载的6G多的iso安装后 #ifconfig -a 如下 enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500l ...