008——树

目录

树:

相关概念:

1.结点:

结点和结点之间的关系

2.度

3.n叉树

4.高度/深度

5.有序树和无序树

6.空树:

树的存储结构/表示方法:

树中都需要存储什么?

1.双亲表示法

2.孩子表示法

可以将上面两个方法结合起来

3.孩子兄弟表示法 (用到递归)


树:

        数据之间存在一对多的关系

 树和子树之间的关系,可以类比于集合和子集,但是子树的根节点下的所有结点都包括的才叫做子树,下面图片圈出来的都是,若是ABCD组成的并不叫作子树。

树的定义是具有递归性的,即树中有树 

相关概念:

1.结点:

        把每一个数据都存放在树中的一个结点中

              根结点:没有前驱的结点,如上图的A

               叶子结点:没有后继的结点,如上图的KLMFGIJ

结点和结点之间的关系

                父子关系 -->父亲结点、孩子结点

                兄弟关系 -->兄弟结点(有广义(堂兄弟)和狭义(亲兄弟)上的)

                                

        注意:结点间的关系是相对的,如果在没有前提的条件下,说谁是谁的xx(关系)的说法是错误的

2.度

        结点的度:看该结点有几个度(只算一层)如A的度是3(BCD三个孩子)

                 度为0的结点是叶子结点√

        树的度:树中所有的结点的最大值 ,如上图的树的度是3

3.n叉树

        度为n的树,在n叉树中,每个结点最多有n个孩子

4.高度/深度

5.有序树和无序树

        如果是有序树,左子树和右子树的顺序不同,看作不同树;

        如果是无序树,左子树和右子树的顺序不同,仍然看作同一个树;

        后面的代码将树按照无序树来处理

6.空树:

        没有任何结点

树的存储结构/表示方法:

树中都需要存储什么?

     树中的数据-->数组

     数据之间的关系-->父亲(1.双亲表示法) 孩子(2.孩子表示法)孩子和兄弟(3.孩子兄弟表示法)

1.双亲表示法

        指名某个结点的父亲

        在存储数据的时候,我们可以采用结构体数组

struct node{char data;//数据int fi;//data父亲的下标 
}t[105];

        

#include<stdio.h>
#include<stdlib.h>
struct node{char data;//数据int fi;//data父亲的下标 
}t[105];
int size;//树中的节点个数 
void initTree(char x)
{t[0].data=x;t[0].fi=-1;size++;
}
int find(char fx)
{for(int i=0;i<size;i++){if(t[i].data==fx){return i;}}
}
void insert(char x,char fx)
{t[size].data=x;int fx_i=find(fx);t[size].fi=fx_i;size++;
}
int main()
{int n;//输入数据的个数char root; scanf("%d",&n);getchar(); scanf("%c",&root);initTree(root);char x,fx;//x的父亲是fx for(int i=1;i<=n-1;i++){getchar();scanf("%c %c",&x,&fx);insert(x,fx); 	}getchar();scanf("%c",&x);//找x的父亲和孩子//找父亲int x_i=find(x); int fx_i=t[x_i].fi;if(fx_i==-1){printf("根节点,没有父亲节点\n");} else{printf("父亲节点是%c\n",t[fx_i].data);} int sum=0;//孩子的个数 //找孩子:printf("孩子节点是:\n"); for(int i=0;i<size;i++){if(x_i==t[i].fi){sum++;printf("%c ",t[i].data);}}if(sum==0){printf("叶子节点,没有孩子节点\n");}return 0;} 

2.孩子表示法

 孩子表示法

根据上图,我们可以申请一个t数组,t数组中存放有数据和指向孩子的链表,在链表中存放孩子结点的下标,所以代码如下(这里需要注意,链表只是结构体数组的一个成员变量,t的本质仍是数组)

//存放孩子的单链表结点结构
typedef struct childNode {int chi;//存放孩子结点的下标struct childNode* next;//写一个孩子的结点
}chNode;struct node {char data;//存放数据chNode* first;//指向孩子链表
}t[105];

数据的初始化

int size;//记录存储数据的个数,同时可以当作指向下一个将要插入的数据位置的指针//树的初始化
void initTree(char root) {t[0].data = root;t[0].first = NULL;size++;
}

数据的插入(难点)

//寻找对应数据的下标
int find(char x) {for (int i = 0; i < size; i++) {if (t[i].data == x) {return i;}}
}
//插入树的结点
//如果想要插入,首先要知道插入的元素和它的父亲
void insert(char x, char fx) {//先将x放入到t数组中,并将x元素的孩子命名为空t[size].data = x;t[size].first = NULL;//然后再将x的下标存放再fx的的链表中int fxi = find(fx);//寻找fx的下标//申请空间chNode* s = (chNode*)malloc(sizeof(chNode));//为了方便使用,这里我们采用头插法,(无序树)s->chi = size;s->next = t[fxi].first;t[fxi].first = s;size++;
}

理解插入数据的过程:

加入我们想要插入的数据是B,如下图所示

在插入过程,我们需要将让t[2]=B,也就是t[size]=x(x是要插入的数据),所以size即表示数组中元素的个数,又表示将插入数据的位置的下标

因为现在是在插入元素B,而暂时不考虑B的孩子下标的问题,所以让B的孩子下标为空,即t[size].first = NULL;

因为B是A的孩子,为了体现这一关系,需要在A的孩子下标处插入B的下标2,为了方便代码的编写,这里我们采用头插法。

首先我们要找到B的父亲R的下标,这里我们通过find函数来实现,并记录父亲下标为fxi

因为孩子下标是以链表的方式存储,所以我们需要申请一块孩子下标空间,也就是chNode* s = (chNode*)malloc(sizeof(chNode));

然后头插法插入数据

最后size++; 

寻找父亲结点

如果我们知道一个元素,我们很容易知道这个元素的孩子都有哪些,但如果想要知道这个元素的父亲,则需要遍历整个数组,代码如下:

//寻找元素的父亲
void find_fa(int xi) {chNode* p = NULL;int flag = 0;for (int i = 0; i < size; i++) {p = t[i].first;while (p!=NULL&&p->chi!=xi){p = p->next;}if (p !=NULL && p->chi == xi) {flag = 1;printf("%c",t[i].data);break;}}if (flag == 0) {printf("根节点,没有父亲结点");}
}

寻找孩子结点

//寻找孩子结点
void find_ch(int xi) {chNode* p = t[xi].first;int chi;while (p != NULL) {chi = p->chi;printf("%c", t[chi].data);p = p->next;}
}

整体代码

#include <stdio.h>
#include <stdlib.h>//存放孩子的单链表结点结构
typedef struct childNode {int chi;//存放孩子结点的下标struct childNode* next;//写一个孩子的结点
}chNode;struct node {char data;//存放数据chNode* first;//指向孩子链表
}t[105];int size;//记录存储数据的个数,同时可以当作指向下一个将要插入的数据位置的指针//树的初始化
void initTree(char root) {t[0].data = root;t[0].first = NULL;size++;
}//寻找对应数据的下标
int find(char x) {for (int i = 0; i < size; i++) {if (t[i].data == x) {return i;}}
}
//插入树的结点
//如果想要插入,首先要知道插入的元素和它的父亲
void insert(char x, char fx) {//先将x放入到t数组中,并将x元素的孩子命名为空t[size].data = x;t[size].first = NULL;//然后再将x的下标存放再fx的的链表中int fxi = find(fx);//寻找fx的下标//申请空间chNode* s = (chNode*)malloc(sizeof(chNode));//为了方便使用,这里我们采用头插法,(无序树)s->chi = size;s->next = t[fxi].first;t[fxi].first = s;size++;
}//寻找父亲结点
void find_fa(int xi) {chNode* p = NULL;int flag = 0;for (int i = 0; i < size; i++) {p = t[i].first;while (p!=NULL&&p->chi!=xi){p = p->next;}if (p !=NULL && p->chi == xi) {flag = 1;printf("%c",t[i].data);break;}}if (flag == 0) {printf("根节点,没有父亲结点");}
}//寻找孩子结点
void find_ch(int xi) {chNode* p = t[xi].first;int chi;while (p != NULL) {chi = p->chi;printf("%c", t[chi].data);p = p->next;}
}
int main() {return 0;
}

 

可以将上面两个方法结合起来

3.孩子兄弟表示法 (用到递归)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL之基础篇

数据库操作 1.查看当前的数据库版本 select version(); 2.显示所有数据库 show databases; 3.创建数据库 create [if not exists] database 数据库名 character set 字符编码集 collate 排序规则&#xff1b; 我们这里提前说一下 被方括号括起来的代码 表示可写可不写 示例…

Linux 安装redis主从模式+哨兵模式3台节点

下载 https://download.redis.io/releases/ 解压 tar -zxvf redis-7.2.4.tar.gz -C /opt chmod 777 -R /opt/redis-7.2.4/安装 # 编译 make # 安装&#xff0c; 一定是大写PREFIX make PREFIX/opt/redis-7.2.4/redis/ install配置为系统服务 cd /etc/systemd/system/主服务…

spring揭秘24-springmvc02-5个重要组件

文章目录 【README】【1】HanderMapping-处理器映射容器【1.1】HanderMapping实现类【1.1.1】SimpleUrlHandlerMapping 【2】Controller&#xff08;二级控制器&#xff09;【2.1】AbstractController抽象控制器&#xff08;控制器基类&#xff09; 【3】ModelAndView(模型与视…

从零开始搭建UVM平台(三)-加入objection机制

书接上回&#xff1a; 从零开始搭建UVM平台&#xff08;一&#xff09;-只有uvm_driver的验证平台 从零开始搭建UVM平台&#xff08;二&#xff09;-加入factory机制 加入objection机制 需要在第一个消耗仿真时间语句前raise_objection&#xff0c;最后再drop_objection&…

【微服务即时通讯系统】——etcd一致性键值存储系统、etcd的介绍、etcd的安装、etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…

2024年7月大众点评武汉餐饮美食店铺基础信息

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时&#xff0c;大众点评的数据参考价值非常大&#xff0c;截至2024年7月&#xff0c;大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 武汉餐饮美食店铺约9.6万家&#xff0c;有均…

实验1.2 熟悉VRP基本操作

实验1.2 熟悉VRP基本操作 原理概述 VRP&#xff08;Versatile Routing Platform&#xff0c;通用路由平台&#xff09;是华为公司数据通信产品的通用网络操作系统平台&#xff0c;拥有一致的网络界面、用户界面和管理界面。在VRP操作系统中&#xff0c;用户通过命令行对设备下…

Kettle9连接mysql8.0.36失败处理

一、问题描述 kettle作为数据转换同步的工具&#xff0c;使用java开发&#xff0c;连接数据库使用jar的驱动包&#xff0c;比如oracle连接使用ojdbc8.jar&#xff0c;mysql连接使用mysql-connect-java-8.0.*,但是截止目前mysql8.0.33到8.0.36在官网是没有mysql驱动包的&#x…

Vue之axios请求

Vue之axios请求 axios请求, 是Vue前端框架非常重要的一部分, 今天我们就讲解axios请求, 到底有什么作用, 以及会告诉大家axios的常见用法。 axios请求, 是网页向后端发起请求, 后端吧数据给我们网页, 这是一个前后端交互的过程。当我们学会了axios, 我们可以实现前端和后端练…

PIKACHU | PIKACHU 靶场初识

关注这个靶场的其他相关笔记&#xff1a;PIKACHU —— 靶场笔记合集-CSDN博客 0x01&#xff1a;PIKACHU 靶场简介 PIKACHU 是一款开源的练习 Web 漏洞的综合靶场&#xff0c;使用 PHP 代码编写而成&#xff0c;它包含了多种常见的 Web 安全漏洞&#xff0c;适合不同水平的用户…

redis 中IO多路复用与Epoll函数

一 IO多路复用 1.1 IO多路复用作用

C++之Swap类

main.cpp #include <iostream> #include <vector> #include <ctime> #include "Swap.h"using namespace std;int main() {Array myArrays;srand(time(0));for (int i 0; i < 7; i) {int tempArray (rand() % 100); // 生成0到99之间的随机数…

【动态规划】最长回文子串

最长回文子串&#xff08;难度&#xff1a;中等&#xff09; 该题对应力扣网址 思路 题目分成三种情况 情况一&#xff1a;每一个字符都是长度为1的回文串 情况二&#xff1a;长度大于2的回文串&#xff1a;看从i到j的字符串包含的从i1到j-1的字符串是否是回文串&#xff08…

关于液氮罐的液氮补给方式

液氮用于低温保存生物样本&#xff0c;如细胞、组织和其他样品&#xff0c;确保其长期存储而不失活。当液氮罐中的液氮水平下降时&#xff0c;及时补给是至关重要的。补给液氮的步骤较为简单&#xff0c;但需要遵循一定的安全标准和操作规范&#xff0c;以确保样本的安全和液氮…

数据治理005-血缘关系

数据血缘是元数据产品的核心能力&#xff0c;但数据血缘是典型的看起来很美好但用起来门槛很高的技术&#xff0c;只要你采买过元数据产品就知道了。这篇文章对数据血缘的特征、价值、用途和方法做了系统阐述&#xff1a; 1、特征&#xff1a;归属性、多源性、可追溯及层次性 2…

2022年上真题(案例分析)

一、数据流图 1. E1&#xff1a;商户 E2&#xff1a;外卖平台 E3&#xff1a;用户 E4&#xff1a;支付系统 2. D1&#xff1a;商户用户信息表 D2&#xff1a;订单表 D3&#xff1a;餐品信息表 D4&#xff1a;评价表 3. 数据流名称 …

Python Daphne库:ASGI服务的高效Web服务器

更多Python学习内容&#xff1a;ipengtao.com 随着 Web 开发技术的不断发展&#xff0c;异步编程逐渐成为构建高性能 Web 应用的主流方式。传统的 WSGI 接口已经不能满足现代异步 Web 应用的需求。ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;作为 WSGI…

智慧园区建设,构建智能监控和安防体系

智慧园区是指运用先进的信息技术和互联网思维&#xff0c;以提升园区管理和服务水平为目标&#xff0c;通过整合各类资源、优化园区运营&#xff0c;打造智能化、智能、绿色、低碳的现代园区。在智慧园区中&#xff0c;智慧楼宇、智能监控、智慧消防和智慧安防是不可或缺的重要…

项目实战:k8s部署考试系统

一、新建nfs服务器&#xff08;192.168.1.44&#xff09; 1.基础配置&#xff08;IP地址防火墙等&#xff09; 2.配置时间同步 [rootlocalhost ~]# yum -y install ntpdate.x86_64 [rootlocalhost ~]# ntpdate time2.aliyun.com 27 Sep 10:28:08 ntpdate[1634]: adjust tim…

机器学习-KNN

KNN&#xff1a;K最邻近算法&#xff08;K-Nearest Neighbor,KNN&#xff09; 用特征空间中距离待分类对象的最近的K个样例点的类别来预测。 投票法&#xff1a;K 个样例的对数类别。 k1:最近邻分类 k 通常是奇数&#xff08;因为我们根据这个K数据判断类别&#xff0c;如果…