C++树形结构(1 基础)

目录

一.基础:

1.概念:

2.定义:

Ⅰ.树的相关基础术语:

Ⅱ.树的层次:

3.树的性质:

二.存储思路:

1.结构体存储:

 2.数组存储:

三.树的遍历模板:

四.信息统计方式:

1.自顶向下统计:

2.自底向上统计

五.基础练习:


一.基础知识 :

1.概念:

在前面学过的存放数据的容器有:数组、链表、栈、队列等,这些都是线性结构,数据元素之间存在一对一的线性关系。但在实际生活中,往往是非线性关系,数据元素之间的关系通常可以一对多。所以必须要把这些数据关系储存下来。其实树形结构就像递归数一样。递归树中,都只能从父节点走到子节点。我们只需要记录每个父节点有哪些子节点,那么就可以遍历整个递归树。我们可以用动态数组(vector)来记录每个节点的子节点。这就是树的孩子表示法

2.定义:

Ⅰ.树的相关基础术语:

(1).根节点:最顶层的节点就是根结点,它是整棵树的源头,一般用root表示。如1

(2)叶子节点:在树最底端的节点,就是其子节点个数为0的节点。如4、7、6、3

(3).节点的度:指定节点有子节点的个数。如2的度为3

(4).无根树:没有指定根节点的树,树的形态多样。明显这里以1为根和以5为根,树的形态不一样。

(5).有根树:指定了根节点的树,树的形态唯一。

(6).森林:由多棵树构成

(7).链长:边权相加。

Ⅱ.树的层次:

(1).节点高度:指从这个节点到叶子节点的距离(一共经历了几个节点)。

(2).树的高度:指所有节点高度的最大值。

(3).节点的层:从根节点开始,假设根节点为第1层,根节点的子节点为第2层,依此类推

3.树的性质:

性质1:n个节点,保证任意两点有且仅有一条路径,树中有且仅有n-1条边。

证明:除第一个节点外,连接一个其他节点,至少增加一条边,所以n个点至少要用n-1条边才能保证所有节点连通。若此时再增加一条非重边,任意两点间是否还存在一条唯一路径。

性质2:树的根结点没有前驱(父节点),除根结点外的所有结点有且只有一个前驱。树中所有结点可以有零个或多个后继(子节点)。

证明:同上。

二.存储思路:

输入一个数字n表示一颗有n个点的树。接下来一行输入n个数,表示每个点上的权值ai。后面n-1行,每行输入三个数u,v,w,表示节点u,v存在一条边,边权为w。请把所有信息保存下来。

1.结构体存储:

用结构体把每个节点的信息进行封装。这样的优点在于节点信息非常独立,但是所占空间稍大。

struct node{int data;vector<int> v,w;
}a[105];
int main(){cin>>n;for(int i=1;i<+n;i++) cin>>a[i].data;for(int i=1;i<=n;i++){int x,y,z;cin>>x>>y>>z;a[x].v.push_back(y);a[y].v.push_back(x);a[x].w.push_back(z);a[y].w.push_back(z);}
}

 2.数组存储:

用多个数组,分别描述每个节点的对应信息。这种方式的有点在于速度稍快,写起来简单。

int data[105]
vector<int> v,w;
int main(){cin>>n;for(int i=1;i<=n;i++) cin>>data[i];for(int i=1;i<=n;i++){int x,y,z;cin>>x>>y>>z;v[x].push_back(y);v[y].push_back(x);w[x].push_back(z);w[y].push_back(z);}
}

三.树的遍历模板:

我们可以发现前两道例题都是有向的边,所以不担心会从子节点重新走到父亲节点。但是通常来讲,树的边都是双向的我们在遍历的时候不希望一个点遍历多次。我们可以用dfs中记录由父亲节点(来向),这样可以阻止走回去。

void dfs(int x,int fa){for(int i=0;i<v[x].size();i++){int y=v[x][i];if(x==fa) continue;dfs(y,x);}
}

四.信息统计方式:

1.自顶向下统计:

操作方法:在进入dfs之前进行信息统计。如求链长:树上两个节点必然有且仅有一条路径,我们可以把该路径看成一条链。路径上的边权和为两点的链长。

计算有根树中任意点到根节点的距离

int data[105];
void dfs(int x,int fa) {for(int i=0; i<v[x].size(); i++) {int y=v[x][i];if(y==fa) continue;data[y]=data[x]+w[x][i];dfs(y,x);}
}

扩展:输出有根树最长链的路径

在dfs时进行路径记录,用pre数组记录当前节点是由哪一个父亲节点走过来。
当找到最长链的终点,根据每个节点只有一个父亲。倒着找回去,就能输出完整路径。

int data[105],pre[105];
void dfs(int x,int fa) {for(int i=0; i<v[x].size(); i++) {int y=v[x][i];if(y==fa) continue;data[y]=data[x]+w[x][i];dfs(y,x);}
}
void print(int x){vector<int> r;for(int i=x;i>0;i=pre[i]) r.push_back(i);for(int i=r.size()-1;i>=0;i--) cout<<i<<" ";
}

2.自底向上统计

操作方法:在dfs回溯之时进行信息统计。如求树的节点个数:当前树上共有多少个节点。

子树的概念:抹除当前根节点以及所有与根节点的连边后,产生的树都是当前根节点的子树。
如当前根节点1的子树有,以2、3、4为根的子树。

计算有根树中各子树的节点个数:

int data[105];
void dfs(int x,int fa) {data[x]=1;for(int i=0; i<v[x].size(); i++) {int y=v[x][i];if(y==fa) continue;dfs(y,x);data[x]+=data[y];}
}

五.基础练习:

题目:

给定一棵有n个点的树(结点个数≤100),指定根节点为1。每个点带有点权。求以1为根节点的最大子树大小,以及最大影响力。影响力=该点权*该点向下的最大子树(这里的子树不包括从根节点来的部分)。

题目分析:

先用dfs求出每个各点的为根的节点个数(子树大小),用sz数组进行保存,并且在整个回溯过程中,不断比较节点1相连的几颗子树,求取最大值。

正确代码:

#include<bits/stdc++.h>
using namespace std;
int n,data[1001],s[1145],maxn;//data数组记录以i为根的子树大小
vector<int> v[105];
vector<int> w[105];
void dfs(int x,int fa){s[x]=1;for(int i=0;i<v[x].size();i++){int y=v[x][i];if(y==fa) continue;dfs(y,x);s[x]+=s[y];//记录点权相加maxn=max(s[y],maxn);//打擂台求最大}
}
int main() {cin>>n;for(int i=1;i<=n;i++) cin>>data[i];for(int i=1; i<n; i++) {int x,y;cin>>x>>y;v[x].push_back(y);v[y].push_back(x);}dfs(1,0);cout<<maxn<<" ";maxn=0; for(int i=1;i<=n;i++){maxn=max(s[i]*data[i],maxn);//打擂台求最大影响力}cout<<maxn;return 0;
}

树形结构(2 树的直径):C++树形结构(2 树的直径)-CSDN博客

 树形结构(3 树的中心、重心):C++树形结构(3 树的中心、重心)-CSDN博客

树形结构(总):https://blog.csdn.net/Archie28/article/details/140504428

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

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

相关文章

用 python scipy 库模拟拥塞控制模型

接着昨天的继续说&#xff0c;参见 inflight 守恒建模。 欧拉数值解看起来不够优雅&#xff0c;所以我打算找个别的方式试一下&#xff0c;顺便学一下 python&#xff0c;我不会编程&#xff0c;但也不是一点也不会&#xff0c;我稍微会一点&#xff0c;所以想进一步学习一点。…

记录unraid docker更新的域名

背景&#xff1a;级联 一、安装内容 unraid更新docker&#xff0c;之前一直失败&#xff0c;修改网络后可以进行安装。 二、查看域名 查看域名&#xff0c;发现是走github的&#xff0c;怪不得有一些docker无法正常更新 三、解决方法 更改代理&#xff0c;这里为unraid的…

STM32智能城市交通管理系统教程

目录 引言环境准备智能城市交通管理系统基础代码实现&#xff1a;实现智能城市交通管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;城市交通管理与优化问题解决方案与优化收尾与总结 1. 引言 智能城…

Vue2高级用法

Vue2高级用法 1、mixin复用【vue不会用了&#xff0c;了解一下】1.1 基础使用1.2 选项合并1.3 全局混入1.4 细数 mixin 存在的问题 2、vue.js 动画特效&#xff06; 常见组件库介绍2.1 进入/离开基础使用示例2.2 进入/离开自定义过度类名2.3 进入/离开动画钩子2.4 多组件过渡与…

c++树(一)定义,遍历

目录 树的定义 树的基本术语 树的初始起点&#xff1a;我们定义为根 树的层次&#xff1a; 树的定义&#xff1a; 树的性质 性质1&#xff1a; 性质2&#xff1a; 树形结构存储的两种思路 树的遍历模板 树上信息统计方式1-自顶向下统计 树上信息统计方式2-自底向上统…

【UbuntuDebian安装Nginx】在线安装Nginx

云计算&#xff1a;腾讯云轻量服务器 操作系统&#xff1a;Ubuntu-v22 1.更新系统软件包列表 打开终端并运行以下命令来确保你的系统软件包列表是最新的&#xff1a; sudo apt update2.安装 Nginx 使用以下命令安装 Nginx&#xff1a; sudo apt install nginx3.启动 Nginx…

Docker-Compose配置zookeeper+KaFka+CMAK简单集群

1. 本地DNS解析管理 # 编辑hosts文件 sudo nano /etc/hosts # 添加以下三个主机IP 192.168.186.77 zoo1 k1 192.168.186.18 zoo2 k2 192.168.186.216 zoo3 k3注&#xff1a;zoo1是192.168.186.77的别名&#xff0c;zoo2是192.168.186.18的别名&#xff0c;zoo3是192.168.186.1…

企元数智引领新零售合规分销系统免费送

企元数智近日宣布推出全新的新零售合规分销系统&#xff0c;并免费向企业提供这一创新解决方案。这一举措旨在帮助更多企业实现数字化转型&#xff0c;提高管理效率&#xff0c;促进业务增长。 新零售合规分销系统是企元数智引领的一项全新数字解决方案&#xff0c;涵盖了销售数…

Linux第四节课(指令与权限)

1、date指令(时间) 程序运行到自己的每一个关键时刻&#xff0c;都要自己打日志&#xff01; 日志包括时间、日志等级、日志具体信息、其他信息等&#xff0c;然后按照行为单位写入文件中&#xff0c;这个文件被称为日志文件&#xff01; 在日志文件中筛选信息时&#xff0c…

【Unity国产化信创平台】虚拟机VMware Workstation Pro虚拟机下载安装

目录 一、虚拟机软件VMware Workstation Pro下载 二、虚拟机安装流程 1.傻瓜式安装 2.是否自动安装WHP 一、虚拟机软件VMware Workstation Pro下载 https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 官网各种访问出错&#xff0c;下载界面总是…

H3CNE(vlan与子接口技术)

目录 10.1 vlan间通信技术 示例一&#xff08;多臂路由&#xff09;&#xff1a; 10.2 子接口技术 示例二&#xff08;子接口技术&#xff09;&#xff1a; 10.3 vlannif接口技术 10.3.1 三层交换机与VLANNIF技术 示例三VLANNIF配置&#xff08;将交换机当成路由器使用&…

DLMS/COSEM中公开密钥算法的使用_椭圆曲线加密法

1.概述 椭圆曲线密码涉及有限域上的椭圆曲线上的算术运算。椭圆曲线可以定义在任何数字域上(实数、整数、复数)&#xff0c;但在密码学中&#xff0c;椭圆曲线最常用于有限素数域。 素数域上的椭圆曲线由一组实数(x, y)组成&#xff0c;满足以下等式: 方程的所有解的集合构成…

Go语言---list的声明、常用方法以及遍历

List所在的库 Go语言的链表实现在其标准库的container/list代码包中。 import "container/list"这个包含了两个公开的程序实体&#xff1a;List和Element。 List代表一个双向链表&#xff0c;其零值为一个空的、可用的链表&#xff1b;Element代表双向链表中的一个…

Python | Leetcode Python题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution { public:// 判断是否为完全平方数bool isPerfectSquare(int x) {int y sqrt(x);return y * y x;}// 判断是否能表示为 4^k*(8m7)bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7;}int numSquares(i…

注册邮箱需要实名认证吗

注册邮箱需要进行实名认证吗&#xff1f;都需要认证哪些信息呢&#xff1f;邮箱实名认证提高安全性和责任感&#xff0c;但可能涉及隐私顾虑。本文将详细介绍邮箱实名认证的相关内容。 一、邮箱实名认证的定义和目的 1、定义 电子邮件实名验证是指客户在注册电子邮件服务时&…

初阶数据结构之栈和队列

栈和队列是两种特殊的线性表&#xff0c;都可以用数组或者链表来实现&#xff0c;接下来就让我们看看栈和队列会有什么奥秘吧~ 目录 1.栈 1.1栈的概念 1.2栈的实现 1.2.1 Stack.h 1.2.2 Stack.c 1.2.3 test.c 2.队列 2.1队列的概念 2.2队列的实现 2.2.1 Queue.h 2…

【科研】# Taylor Francis 论文 LaTeX template模版 及 Word模版

【科研写论文】系列 文章目录 【科研写论文】系列前言一、Word 模板&#xff08;附下载网址&#xff09;&#xff1a;二、LaTeX 版本方法1&#xff1a;直接网页端打开&#xff08;附网址&#xff09;方法2&#xff1a;直接下载到本地电脑上编辑下载地址说明及注意事项 前言 给…

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)

【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(下) 大家好 我是寸铁&#x1f44a; 【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(下)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&…

配置web服务器练习

4练习要求&#xff1a; 练习一&#xff1a;配置web服务器&#xff0c;当访问网站 www.haha.com 时显示&#xff1a;haha 练习二&#xff1a;配置web服务器&#xff0c;当访问网站 www.xixi.com/secret/ 时显示&#xff1a;this is secret 具体步骤&#xff1a; 1、配置yum…

压测实操--produce压测方案

作者&#xff1a;九月 环境信息&#xff1a; 操作系统centos7.9&#xff0c;kafka版本为hdp集群中的2.0版本。 Producer相关参数 使用Kafka自带的kafka-producer-perf-test.sh脚本进行压测&#xff0c;该脚本参数为&#xff1a; 在producer涉及到性能的关键因素可能会存在如…