内容简介:多年前,还是一个对计算机懵懵懂的少年,学了一门犹如天书般的课程叫数据结构,课程里面每个知识点在当时来说是异常抽象。毕业后写了几年代码,再次学习一下数据结构中的一个重要概念--树。思考:如何理解数据结构的概念?数据结构是指相互之间存在一种或多种特定关系的数据元素集合在计算机中组织和存储的方式。我个人觉着也可以理解为数据结构是现实世界中关系实体在计算机世界中的一种抽象描述。
树
多年前,还是一个对计算机懵懵懂的少年,学了一门犹如天书般的课程叫数据结构,课程里面每个知识点在当时来说是异常抽象。毕业后写了几年代码,再次学习一下数据结构中的一个重要概念--树。
思考:如何理解数据结构的概念?
数据结构是指相互之间存在一种或多种特定关系的数据元素集合在计算机中组织和存储的方式。我个人觉着也可以理解为数据结构是现实世界中关系实体在计算机世界中的一种抽象描述。
树是一种计算机世界中的数据结构,其中一个结点元素可以对应两个或多个子结点元素,具有一对多的特点,下面是一些关于“树”的概念。
- 结点的度:子结点的个数。上图中node1有3个子结点,故其度为3。
- 树的度:树的度等于所有结点度最高的值。结点最高的度为3,树的度为3。
- 叶子结点:度为0的结点,即没有子结点的结点。上图中node4,node5,node6,node7为叶子结点。
树的存储
“树”这种数据结构是我们用计算机对现实世界中关系实体的抽象描述,那么这种描述在计算机内存中的存储需要进一步转换为内存可以解析的结构。计算机内存中可以解析的“存储结构”有两种, 顺序表 (连续存储空间)和 链表 (非连续存储空间)。
1 双亲表示法(顺序存储结构)
顺序存储用一组连续的内存空间来存储树的结点,同时在每个结点中附加一个标识(整数类型),用于指示双亲结点的位置(下标值),如下图所示。
内存中的顺序表一般对应我们程序(高级语言)中的数组(Array),那么上面树的双亲表示法JavaScript描述见下面代码。
// JavaScript
[
{value: 'node1', parent: -1},
{value: 'node2', parent: 0},
{value: 'node3', parent: 0},
{value: 'node4', parent: 0},
{value: 'node5', parent: 1},
{value: 'node6', parent: 2},
{value: 'node7', parent: 2},
]
复制代码
2 孩子链表表示法(链式存储结构)
链式存储用非连续的内存空间来存储树的结点,孩子链表表示存储可以很方便的找到每个结点的子结点及其兄弟结点,如下图所示。如果带上双亲域(即与双亲表示法结合),还可以很方便的找出其双亲结点。
内存中的链表一般对应我们程序(高级语言)中的指针或引用,那么上面树的孩子链表表示法JavaScript描述见下面代码。
[
{
value: 'node1',
child: {
index: 1,
siblings: {
index: 2,
siblings: {
index: 3,
siblings: null
}
}
}
},
{
value: 'node2',
child: {
index: 4,
siblings: null
}
},
{
value: 'node3',
child: {
index: 5,
siblings: {
index: 6,
siblings: null
}
}
},
{value: 'node4', child: null},
{value: 'node5', child: null},
{value: 'node6', child: null},
{value: 'node7', child: null},
]
复制代码
3 孩子兄弟表示法(链式存储结构)
孩子兄弟存储结构每个结点有两个指针,分别指向其左右孩子结点,比较适用于二叉树(结点的度小于3的树)。孩子兄弟存储结构可以很方便的找到每个结点的子结点,如下图所示。
孩子兄弟存储结构JavaScript描述见下面代码。
{
value: 'node1',
left: {
value: 'node2',
left: {
value: 'node4',
left: null,
right: null
}
right: {
value: 'node5',
left: null,
right: null
}
},
right: {
value: 'node3',
left: {
value: 'node6',
left: null,
right: null
}
}
}
复制代码
用计算机来解决现实社会中的问题,需要把现实世界中的实体关系模拟到计算机世界中,那么这个时候就会产生数据结构,这是“数据结构”最终需要映射到内存中,所以需要进一步用计算机可以解析的程序来进行描述。
树的遍历
树的遍历是指依照一定的规律不反复的访问树中的每个结点,其遍历过程实质上是将树这样的非线性结构按一定规律转化为线性结构,遍历方式一般有先序和后续两种(二叉树有三种)。
先根次序遍历:先访问根结点,上树遍历结果为Rawxdhebfcstimonju
后根次序遍历:先访问子结点,后访问根结点,上树遍历结果为whdexafbsmonijtucR
本篇文章是作者参考了一些文献之后加上个人理解对数据结构中的“树”做出的部分总结,如果有解释不正确的地方,希望读者在评论区果断提出来,我们一起共同进步。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 重温数据结构系列--二叉树、堆
- 数据结构与算法的重温之旅(三)——数组
- 数据结构与算法的重温之旅(六)——栈
- 数据结构与算法的重温之旅(二)——复杂度进阶分析
- 冒泡排序——重温排序(三)
- 【重温基础】7.时间对象
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员成长的烦恼
吴亮、周金桥、李春雷、周礼 / 华中科技大学出版社 / 2011-4 / 28.00元
还在犹豫该不该转行学编程?还在编程的道路上摸爬滚打?在追寻梦想的道路上你并不孤单,《程序员成长的烦恼》中的四位“草根”程序员也曾有过类似的困惑。看看油田焊接技术员出身的周金桥是如何成功转行当上程序员的,做过钳工、当过外贸跟单员的李春雷是如何自学编程的,打小在486计算机上学习编程的吴亮是如何一路坚持下来的,工作中屡屡受挫、频繁跳槽的周礼是如何找到出路的。 《程序员成长的烦恼》记录了他们一步一......一起来看看 《程序员成长的烦恼》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
在线进制转换器
各进制数互转换器