| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构之树 -> 正文阅读 |
|
[数据结构与算法]数据结构之树 |
1. 树参考链接: 1.1 基本概念? ? ? ?在计算机科学中,树(Tree)作为一种抽象的数据结构,用来模拟具有树状结构性质的数据集合,表示一对多的对应关系,考虑它的各种特性,来解决我们在编程中碰到的相关问题。它是由n(n≥0)个结点组成的一个具有层次关系的有限集合,之所以把它叫做”树”,是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树的定义就是在讲解栈时提到的递归的方法,即在树的定义之中还会用到树的概念。 ? ? ? ?与栈、队列、链表不同,树是一种非线性的数据结构。一棵树只能有一个根结点,拥有多个根结点的数据结构是树的集合,即森林。 ? ? ? ?实际在现实生活中,树状结构是十分普遍的。例如在我们的计算机磁盘上存储的文件夹和文件,就能够构成一个文件树结构。其中,盘符下存储有文件和文件夹,文件夹下又有子文件和子文件夹,但是文件之下一定不会有其他子文件和子文件夹。如果将这些层次关系表示成一棵树,其结构如下: 通过上面这张图我们可以看出:
? ? ? ?在上图中 ,我们称所有的盘符、文件夹和文件为树结构的结点;而连接结点与结点之间的通路,称之为路径。如果一个结点指向另一个结点(例如文件夹1和文件2的关系),那么我们称上面指出的结点为父结点或者双亲结点(文件夹1);下面被指向的结点称为父结点的孩子结点(文件2),孩子结点简称子结点。 综上,引出数的基本定义如下:
将线性表与树的结构进行对比如下:
1.2 树的存储结构及Java实现? ? ? ?实现树的一种方法可以是在每一个结点除存储数据外还要存储一些链,使得该结点的每一个儿子都可以有一个链指向它。然而每个结点的儿子树并不确定,因此在数据结构中建立到各儿子结点的直接的链接是不可行的,因为这样会浪费太多的空间。 ? ? ? ?顺序存储和链式存储都不能很好地反映出树的逻辑关系,故需采用顺序和链式相结合的方式。树的存储方式主要有以下三种:
1.2.1 双亲表示法具体介绍详见:程杰《大话数据结构(溢彩加强版)》P130-P133 ? ? ? ?双亲表示法采用顺序表(也就是数组)存储普通树,其实现的核心思想是:顺序存储各个结点的同时,给各结点附加一个记录其父结点位置的变量。注意:根结点没有父结点,因此根结点记录父结点位置的变量通常设为 -1。其结构特点如图所示: 对于下图的树而言,存储状态如表所示: ? 对应Java代码实现: ?class TreeNode{ ? ? int data; ? ? int parent; ? ? TreeNode(){} ? ? TreeNode(int val){ ? ? ? ? this.data = val; ? ? } ?} ?? ?public class Tree { ? ? TreeNode[] treeNodes; ? ? int n; ?} 1.2.2 孩子表示法具体介绍详见:程杰《大话数据结构(溢彩加强版)》P133-P136 ? ? ? ?孩子表示法采用顺序加链式的存储方式,首先会建立一个顺序表存储树中的各个结点,此外,孩子表示法还会在每个结点后配备一个链表,用于存储它的子女结点,无子女结点的结点对应的是空链表。存储状态示意图如下: 对应Java代码实现: ?class TreeNode{ ? ? int val; ? ? TreeNode next; ? ? TreeNode(){} ? ? TreeNode(int val){ ? ? ? ? this.val = val; ? ? } ?} 1.2.3 孩子兄弟表示法具体介绍详见:程杰《大话数据结构(溢彩加强版)》P136-P137 ? ? ? ? 孩子兄弟表示法采用的是链式存储的方式,从树的根结点开始,依次使用链表存储各个结点的孩子结点和兄弟结点,该链表中的结点分为三部分:孩子结点、数据域、兄弟结点。存储状态示意图如下: 对应Java代码实现: ?class TreeNode{ ? ? int val; ? ? TreeNode child; ? ? TreeNode brother; ? ? TreeNode(){} ? ? TreeNode(int val){ ? ? ? ? this.val = val; ? ? } ?} 2. 二叉树待完善。。。。。。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 2:18:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |