【笔记】树(Tree)

一、树的基本概念

1、树的简介

之前我们都是在谈论一对一的线性数据结构,可现实中也有很多一对多的情况需要处理,所以我们就需要一种能实现一对多的数据结构--“树”。

2、树的定义

树(Tree)是一种非线性的数据结构,它是n(n >= 0)个结点组成的一个具有层次关系的有限集。之所以把它叫做树是因为它看起来像一颗倒挂的树,也就是它的根是朝上,而叶子是朝上的。

在n=0时称为空树。在任意一颗非空树中:

  1. 有且仅有一个特定的称为根(Root)的结点;
  2. 当n>1时,其余结点可分为m(m > 0)个互不相交的有限集T1、T2、...... 、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

注意:在树型结构中,子树之间不能有交集,否则就不能是树形结构。 如果相交了,那就是图。

3、树的一些基本术语

就拿这张图来举例子

  1. 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
  2. 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
  3. 非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
  4. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
  5. 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
  6. 兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
  7. 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
  10. 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
  11. 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
  12. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
  13. 森林:由m(m>0)棵互不相交的树的集合称为森林;

二、树的存储结构

提及存储结构,那必然会想到两种常用的存储结构。一个是顺序存储结构,另一个则是链式存储结构。这两个存储结构在我们之前学习其他的数据结构中也学习过。

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既要保存值域,也要保存结点和结点之间的关系。实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解双亲表示法,孩子表示法以及孩子兄弟表示法。

1、双亲表示法

我们人可能因为种种原因,没有孩子,但无论是谁都不可能是从石头里蹦出来的(孙悟空除外,它显然不算是人),所以人一定就会有父母。树这种结构也不例外,除了根结点外,其余的每个结点不一定有孩子,但一定有且一个双亲。

#define MAX_TREE_SIZE 100typedef int TElemType;              //树结点的数据类型,目前暂定为整形typedef struct PTNode
{TElemType data;                //结点数据int parent;                    //双亲位置
}PTNode;typedef struct
{PTNode nodes[MAX_TREE_SIZE];    //结点数组    int r,n;                        //根的位置和结点数
}

这样的存储结构,我们根据结点的 parent指针很容易找到它的双亲结点,所用的时间复杂度为O(1)。但麻烦的是如果想要知道结点的孩纸是谁,不好意思,请遍历整个结构才行。

2、孩子表示法

把每个结点的孩子结点排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。

 

为此,需要设计两种结点结构,一个是孩子链表的孩子结点,如下表所示

其中,child是数据域,用来存储某个结点在表头数组中的下标;next是指针域,用来存储指向某个结点的下一个孩子结点的指针。

另一个是表头数组的表头结点,如下表所示

其中,data是数据域,存储某个结点的数据信息;firstchild是头指针域,存储该结点的孩子链表的头指针。

#define max_TREE_SIZE 100typedef int TElemType;                //树结点的数据类型,目前暂定为整形typedef struct CTNode                 //孩子结点
{int child;struct CTNode* next;    
} *ChildPtr;typedef strucct                        //表头结构
{TElemType data;ChildPTr firstchild;
}CTBox;typedef struct                         //树结构
{CTBox nodes[MAX_TREE_SIZE];        //结点数组int r,n;                           //结点位置和结点数
}CTree;

 这样的数据结构对于我们要查找某个结点的孩子,或者找某个结点的兄弟,只需要查找这个结点的孩子单链表即可。对于遍历整棵树也是很方便的,对头结点的数组循环即可。

但是如果想知道某个结点的双亲是谁?就需要遍历整棵树。所以就衍生出了将二者合二为一的方法:孩子兄弟表示法。

3、孩子兄弟表示法

typedef int DataType;
struct Node
{struct Node* _firstChild1; // 第一个孩子结点struct Node* _pNextBrother; // 指向其下一个兄弟结点DataType _data; // 结点中的数据域
};

 这种表示法,给查找某个结点的某个孩子带来了方便,只需要通过firstchild找到此结点的长子,然后通过长子结点的nextbrother找到它的二弟,接着一直下去,直到找到具体的孩子。

三、树在实际中的运用(表示文件系统的目录树结构)


以上就是关于树的基本概念和存储结构的知识点。有关二叉树的内容会在下一个章节中再详细描述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/329917.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度智能云参与信通院多项边缘计算标准编制,「大模型时代下云边端协同 AI 发展研讨会」成功召开

1 中国信通院联合业界制定、发布多项标准化成果,推动产业发展 大模型开启了 AI 原生时代,云边端协同 AI 构建了「集中式大规模训练」、「边缘分布式协同推理」新范式,有效降低推理时延和成本,提升数据安全和隐私性,也…

基于Vue3 + js-tool-big-box工具库实现3个随机数字的小游戏动画,快来挑战你的非凡手气!

不知你是否和我一样,我曾有一个猜3个随机数字的梦,但通过多次的努力,梦想最终未能实现,而且还波多了我的饭票。所以,我要通过vue3 js-tool-big-box 这个工具库,来实现一个猜3个随机数字的小游戏动画&#…

学习通高分免费刷课实操教程

文章目录 概要整体架构流程详细步骤云上全平台登录步骤小结 概要 我之前提到过一个通过浏览器的三个脚本就可以免费高分刷课的文章,由于不方便拍视频进行实操演示,然后写下了这个实操教程,之前的三个脚本划到文章末尾 整体架构流程 整体大…

一键批量提取TXT文档前N行,高效处理海量文本数据,省时省力新方案!

大量的文本信息充斥着我们的工作与生活。无论是研究资料、项目文档还是市场报告,TXT文本文档都是我们获取和整理信息的重要来源。然而,面对成百上千个TXT文档,如何快速提取所需的关键信息,提高工作效率,成为了许多人头…

我的第一个JAVA程序IDEA版

目录 第一步 新建一个空项目第二步 新建模块第三步 新建包第四步 新建类第五步 新建main方法 第一步 新建一个空项目 第二步 新建模块 第三步 新建包 第四步 新建类 然后在包文件夹下新建类 第五步 新建main方法

Java开发之JDBC

JDBC 介绍JDBC程序(Statement)相关细节URLResultSet 连接池程序(PreparedStatement) 本文主要记录一下学习JDBC的一些知识点 介绍JDBC 首先谈谈什么是JDBC。下面放几张图,大致就可以清楚JDBC了。程序(Sta…

RPC原理技术

RPC原理技术 背景介绍起源组件实现工作原理 背景 本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。 介绍 RPC,Remote Procedure Call,远程过程调用,允许像调用本地方法一样调…

bytebuddy入门

简介 Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助。除了 Java 类库附带的代码生成实用程序外,Byte Buddy 还允许创建任意类,并且不限于实现用于创建运行时代理的接口 核…

【信息安全】

信息安全 1.防火墙技术 防火墙是建立在内外网络边界上的过滤封锁机制。 补充内容 防火墙工作层次越低,工作效率越高,安全性越低DMZ的作用是保存一些公共服务器(Web服务器、Eamil服务器)防火墙的安全性从高到底:内网…

kafka Kerberos集群环境部署验证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka keberos安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详细…

微软:最新ChatGPT-4o模型,可在 Azure OpenAI上使用

北京时间5月14日凌晨,OpenAI 一场不到 30 分钟的发布会,正式发布了 GPT-4o,视频语音交互丝滑到吓人,还即将免费可用! GPT-4o,其中的「o」代表「omni」(即全面、全能的意思)&#xff…

FPGA搭积木之按键消抖(改进版)

目录 1.前言 2.回顾之前的设计 3.基于读者思路的设计 4.ModelSim仿真 1.前言 昨天分享的关于FPGA对机械按键消抖的设计,有读者指出了其中的不足,并给出了他的思路。今天就读者的设计思路,来再做一个按键消抖模块。这个程序大概是大学的时…

《Python编程从入门到实践》day34

# 昨日知识点回顾 json文件提取数据、绘制图表渐变色显示 # 今日知识点学习 第17章 17.1 使用Web API Web API作为网站的一部分,用于与使用具体URL请求特定信息的程序交互,这种请求称为API调用。 17.1.1 Git 和 GitHub Git:分布式版本控制系…

每日5题Day4 - LeetCode 16 - 20

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:16. 最接近的三数之和 - 力扣(LeetCode) class Solution {public int threeSumClosest(int[] nums, int target) {//别用dp了,…

docker-compose Install homer

homer前言 一个非常简单的静态主页,为您的服务器保持您的服务在手,从一个简单的yaml配置文件。 前提要求 安装 docker docker-compose 参考创建一键安装homer 脚本 homer安装位置/homerhomer 脚本位置/homer/assetshomer logo 图标/home/assets/iconshomer 端口80homer 颜色…

MySQL5个查询

# 总查询 EXPLAIN SELECT * FROM city; # 范围查询 EXPLAIN SELECT * from city where ID>5 and ID<20; #主键查询 EXPLAIN SELECT * from city where ID5; # 索引查询 EXPLAIN SELECT * from city where CountryCodeNLD; # 普通索引 EXPLAIn SELECT * from cit…

工业交换机的好处有哪些?

工业交换机是现代工业网络中不可或缺的重要组成部分&#xff0c;它扮演着连接和管理各种网络设备的关键角色。工业交换机的优点不言而喻&#xff0c;首先是其稳定可靠的性能&#xff0c;能够支撑工业环境下的高负荷工作。无论是在恶劣的温度、湿度或电磁干扰的环境下&#xff0…

springboot2.x3.x的A项目(作为sdk)集成到启动B项目调用2

一 概述 1.1 说明 本博客记录的案例&#xff0c;逻辑是&#xff1a; 项目A读取配置文件&#xff0c;并在service类的方法进行打印输出。项目A作为sdk被项目B进行依赖&#xff0c; 在项目B启动后&#xff0c;进行调用&#xff0c;并且在B进行参数的配置&#xff0c;能够覆盖…

stm32常用编写C语言基础知识,条件编译,结构体等

位操作 宏定义#define 带参数的宏定义 条件编译 下面是头文件中常见的编译语句&#xff0c;其中_LED_H可以认为是一个编译段的名字。 下面代码表示满足某个条件&#xff0c;进行包含头文件的编译&#xff0c;SYSTEM_SUPPORT_OS可能是条件&#xff0c;当非0时&#xff0c;可以…

路由引入实验(华为)

思科设备参考&#xff1a;路由引入实验&#xff08;思科&#xff09; 技术简介 路由引入技术在网络通信中起着重要的作用&#xff0c;能够实现不同路由协议之间的路由传递&#xff0c;并在路由引入时部署路由控制&#xff0c;实现路径或策略的控制 实验目的 不同的路由协议之…