数据结构与算法之图的应用

news2024/12/27 10:16:28

一.树之习题选讲-Tree Traversals Again

树习题-TTA.1 题意理解

非递归中序遍历的过程

  • 1. Push的顺序为先序遍历(pre)
  • 2. Pop的顺序给出中序遍历(in)

树习题-TTA.2 核心算法

上图分别是先序、中序、后序遍历通过规律我们可以看到他们之间的位置分配
//伪代码
void solve(int preL,int inL,int n)
{
if(n == 0) return;//n等于0的时候什么都不做(n真的会右等于0的时候吗?为什么写他?)调用完了
之后右边没有元素,此时n等于0,进行判断正常结束进程
if(n == 1){post[postL] == pre[preL];return;}//只有一个结点的时候,pre、in、post都
应该等于同一个数字
root = pre[preL];
post[postL+n-1] = root;
for(i = 0; i < n; i++)
if(in[inL+i] == root) break; //判断in这个位置上的元素是不是等于根结点。结合上图看
就是要找根结点在图中的哪里,找到了就跳出循环
//在跳出循环之后我们就同时知道了左子树包含了多少元素,然后递归的去解决左边跟右边的问题
L = i;R = n - L -1//得出左右两边的元素个数
solve(preL+1,inL,postL,L);//左边的
solve(preL+L+1,inL+L+1,postL+L,R)//右边的。第一个是蓝色的第一个位置,第二个也是蓝色一
个的位置,第三个是蓝色的第一个位置(和前两个不同的是这个时候1在蓝色的后面,所以不用加上1了,第四
个参数是右边子问题的总个数)
}

二.树之习题选讲-Complete Binary Search Tree

(完全 二叉 搜索 树)

树习题-CBST.1 数据结构的选择 题意理解

题目要求:

输入一系列整数,要填入一个完全二叉树里面,同时这颗树还需要满足二叉搜索树的性质。也就是说左边的结

点的键值都比根结点要小,右边的全部都比他要大,左右子树也都满足二叉搜索树递归的定义

经过修改后的图片如下:

树的表示法:链表 vs 数组

在这道题目中我们需要的操作:

1.填写数字(某种遍历),意思就是说对这棵树里面的每一个结点访问一次填写一个数字

2.层序遍历

为什么在很多情况下我们宁愿用链表去表示一颗树而不用数组呢?

用数组是可以的,好处是不涉及任何指针的操作。指针的操作通常是比较危险又比较耗时的

缺点:用数组去存,遇到左右不完全相等的树的时候,需要把中间那些不存在的结点的空间保留下来,要是树 极端一点就非常耗费空间,在链表就没有这个问题

在这个问题中我们需要解决的问题:

1. 完全二叉树,不浪费空间(从根结点到最后一个叶子结点一层层走下来没有一个是空的,没有一个元

素是浪费的)

2. 层序遍历 == 直接顺序输出(按照下标顺序输出就结束了,用数组的话)所以我们决定用数组解决这个

问题

树习题-CBST.2 核心算法

如果我们知道左子树一共包含了多少个结点,那就知道根结点R上放的一定是从小到大排第几位的那个

数字

如何知道左子树有多少个结点呢?

1. 给定n个数之后,完全二叉树的结构是固定的,可以非常准确的算出左边一共多少个结点

2. 先给我们要输入的序列从小到大排一个序列。根据完全二叉树一共有多少个结点,通过导出的公式

是可以精确计算他的左子树一共有多少个结点

3. 排序是典型先序遍历的应用

核心算法

TRoot是树T根结点所在的位置,那个元素的下标存在TRoot里面

void solve(int ALeft,int ARight,int TRoot)
{
//初始调用为solve(0,N-1,0)->A的起始点就是A的第0个元素,A的终止点就是A的最后一个元素(N-1
是他的下标),结果树T是完全二叉树,他的根结点一定存在T[0]这个位置,所以刚开始传入的是0
//整个函数要完成的任务就是从A传进去的这一段里面选出一个正确的数字,填到我们结果的这颗
树,TRoot的这颗树上
n = ARight - ALeft + 1;//这一段里面元素总个数n(最右边下标减去最左边下标加上1)
if(n == 0) return;
L = GetLeftLenght(n);//计算出n个结点的树(完全二叉树)其左子树有多少个结点
T[TRoot] = A[ALeft + L];
//左孩子的下标是多少?正常情况下根结点是TRoot的话那他的左孩子下标应该是TRoot×2,但是那是
在堆里面(堆的第0个元素是存放哨兵的地方,不是用来存真实值的),在本题中是从0开始算下标的
LeftRoot = TRoot * 2 + 1;//(例子:左孩子第一个元素0*2+1为1,第二个3...)
RightTRoot = LeftTRoot + 1;//(例子:右孩子第一个元素1+1为2,第二个4...)
//准备递归左右边
solve(ALeft,ALeft + L - 1,LeftTRoot);//左边,ALeft + L - 1是取掉根结点元素的前一个
值
solve(ALeft + L + 1,ARight,RightTRoot);//右边
}

排序(目前凑合用的,后面详细讲解使用)

库函数:qsort

#include<stdlib.h>//调用qsort
int main()
{
....
qsort(A,N,sizeof(int),compare);//根据返回的两个数是正数还是负数还是0来决定两个元素谁
排在前面或者后面或者不做交换
//第一个参数:待排序序列的首元素的位置(就是把读进来的数存在一个叫A的数组里面)也就是说如果我
们要将数组排序的话,这个就是数组首元素的地址
//第二个参数:代排序列的总长度(一共要排N个元素)
//第三个参数:要排元素的大小
//第四个参数:不是变量,是一个函数的名字(可以不叫compare,这个随意),他的作用是比较两个元
素的大小。因为qsort就是比较一对元素的大小来决定哪个元素应该在前面的,哪个元素应该在后面的
....
}
/*compare标准接口
int compare(const void*a,const void*b)传入的是两个带比较元素的指针。需要返回的是三种
整数之一(负数正数或者0,这里浙大的课程中字幕第一次出错负数显示为复数,但其实是负数,需要注意)
{
return *(int*)a - *(int*)b;//后序也可以非常复杂
}
*/

树习题-CBST.3 计算左子树的规模

h是层数

真正计算H的时候X的出来的可能不是整数,但不要紧,X是多少都没有关系,求H的话可以忽略掉X然后

的出来的答案向下取整即可。得到的H就是完美二叉树层数(H),然后就可以反算出X了

完美二叉树的左子树:

如果X的个数蔓延到右子树那边去的话(就是最后一层的x跑到右边去,那上面左子树的式子就不能加上X)

所以我们需要知道最下面一层x的最大值和最小值可以取多少

1. 在这个式子中,最小值X要取到0(为什么不是1而是0呢?L是左子树哦)

1. 因为在上述式子中H至少为2啦,H为1是根结点的位置层数,左子树至少从第二层开始,最少

只有他自己一个

2. 要使

得到正确结果, 能取的最大值是

 

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

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

相关文章

Zabbix在X86服务器上的部署流程

服务器资源:Centos7、X86架构 部署zabbix服务端 #设置SELinux 成为permissive模式临时关闭selinux防火墙 setenforce 0 #获取zabbix的下载源和更换阿里源 https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm #解压zabbix包 …

探花交友_第4章_MongoDB基础(新版)

探花交友_探花交友_第4章_MongoDB基础(新版) 文章目录探花交友_探花交友_第4章_MongoDB基础(新版)课程介绍1. 通用设置1.1 需求分析1.1.1 需求分析1.1.2 数据库表1.1.3 实体类SettingsQuestionBlackList1.2 查询通用设置1.2.1 接口文档1.2.2 代码实现vo对象tanhua-app-serverSe…

易知微11月更新速递 | 预案集如何实现“一屏多端”联动指挥体系

伴随着“2022Easy Future秋季产品发布会”的举行&#xff0c;易知微也迎来了EasyV6.0的全新升级&#xff0c;通过新产品、新服务&#xff0c;助力实现一个能“数智视融合&#xff0c;虚实人联动”的数字增强世界。近一个月我们依旧奋力于产品迭代优化&#xff0c;又给大家带来了…

留学生Paper写作怎么进行深度解析?

对于留学生Paper而言&#xff0c;要想文章显得井井有条&#xff0c;逻辑结构在这个时候就显得很重要&#xff01;为什么这样说呢&#xff1f;首先我们要认识到一点&#xff0c;就是Paper必须做到内容和形式上统一。内容就是文章的主题和材料&#xff0c;形式是指逻辑结构和语言…

视觉小目标检测论文速读

视觉小目标检测论文速读 本文主要针对三篇文章典型文章。 一. SuperYOLO Super Resolution Assisted Object Detection in Multimodal Remote Sensing Imagery 1. 主要工作: 首先去掉Focus模块取保持HR特征, 避免分辨率下降&#xff0c;有效克服小目标空间损失的减少。利…

(一) SpringCloud+Security+Oauth2微服务授权初步认识

一 引言 再前面的security专题中 我们学习了单体架构基于SpringSecurity实现的授权方案,这种在业务量较小及业务的复杂度较低时比较实用,随着业务的复杂度越来越高,微服务架构也越来越被更多的公司使用&#xff0c;本文就微服务中的主流授权方案及oauth2中基本概念做简要概述。…

厨神之蛋糕制作

失败了7次&#xff0c;成功了6次。成功的6次里有好有坏&#xff0c;总结一下蛋糕制作的过程与要点。 原料 低筋面粉&#xff08;筋度越高越偏向包子馒头的口感&#xff0c;松软度越低&#xff09;、白糖、鸡蛋、水&#xff08;也可以用牛奶或其他含水的物质&#xff09;、食用…

多目slam论文阅读系列一:MULTICOL-SLAM论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/1610.07336.pdf 代码&#xff1a;GitHub - urbste/MultiCol-SLAM: This repository contains a multi-fisheye camera SLAM. The underlying SLAM system is based on ORB-SLAM.参考文档&#xff1a;【算法】跑MultiCol-SLAM遇到的效…

Java小区物业管理系统源码带本地搭建教程

技术架构 技术框架&#xff1a;springboot mybatis thymeleaf Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 本地搭建教程 1.下载源码&#xff0c;本地电脑新建一个数据库&#xff0c;导入wuye.sql文件至数据库中。 2.使用IDEA打开wuyeadmin目录&…

web随想笔记

1 OJ大概架构 1.0 OJ页面–>WEB服务器&#xff08;SpringBoot&#xff09;–>判题机(Linux) OJ页面将提交的代码封装成json格式发给web服务器端&#xff0c;服务器端接收json获取信息&#xff0c;进行进一步封装&#xff0c;转发给判题机&#xff0c;拆解json数据获得程…

擦除编码(EC)数据中心中的最优机架协调更新

擦除编码EC在数据中心中的最优机架协调更新介绍与背景工作文章外主流的工作文章摘要RackCU, the optimal Rack-Coordinated Update solution数据增量基础更新奇偶校验基础更新RackCU其他的更新方法一些数值实验可以仅需改进的地方参考文献介绍与背景工作 擦除编码&#xff08;…

Simulink建模:CRC校验模型

本文研究CRC校验的Simulink模型及其代码生成。 文章目录1 CRC校验2 C代码形式3 Matlab/Simulink建模及代码生成3.1 Matlab Function建模3.2 For Iteration子系统建模4 总结与思考1 CRC校验 在汽车软件开发中&#xff0c;CRC校验常用于CAN通信中。通常将某个CAN报文中的数据通过…

【AVL树】

目录基础知识AVL树的定义结点的平衡因子结构体部分操作思路AVL树的插入平衡化旋转左单旋转右单旋转先左后右双旋转先右后左双旋转插入函数AVl树的删除左平衡代码右平衡代码删除函数基础知识 AVL树的定义 一棵AVL树或者是空树&#xff0c;或者是具有谢下列性质的二叉搜索树&am…

Docker 实战——部署 Nginx 镜像容器、Tomcat 镜像容器、MySQL 镜像容器

3.安装 Docker 可使用 yum list docker-ce --showduplicates | sort -r 命令来查看 Docker 的所有版本。 [rootDocker ~]# yum -y install docker-ce-17.12.1.ce #安装docker 4.启动 Docker 并设置开机自启 [rootDocker ~]# systemctl start docker [rootDocker ~]# syste…

uniClound云开发创建流程

uniClound是 DCloud 联合阿里云、腾讯云&#xff0c;为开发者提供的基于 serverless 模式和 js 编程的云开发平台。云服务创建项目&#xff0c;使用熟悉的js&#xff0c;轻松搞定前后台整体业务&#xff0c;使前端开发离全栈开发又进一步&#xff0c;尤其是一键生成代码的功能&…

海外的 SEO 网站如何进行优化

作为一个已经出海12年的专业平台&#xff0c;米贸搜为你整理了一份海外SEO优化方法&#xff0c;希望对你有所帮助。 无论是平台还是外贸网站&#xff0c;无论是外贸还是内销&#xff0c;一个绕不开的话题就是流量。随着各平台和外贸网站竞争的加剧&#xff0c;流量的获取成本也…

【ML】基于机器学习的心脏病预测研究(附代码和数据集,逻辑回归模型)

心脏病是人类健康的头号杀手, 全球大约1/3的人口死亡是由心脏病引起的。而我国,每年大概有几十万人口死于心脏病。如果我们可以通过提取人体相关的指标(既往病史、家族病史、血压情况、血糖情况等等),通过数据挖掘方式来分析不同特征对于心脏病的影响,或者建立电子病历,…

flink1.13.2 text文本数据迁移为orc+snappy数据解决方案

1.表结构不变(列名,分区不变),表存储和压缩算法改变 1.1. 外部表(未分区) 1.1.1. 拷贝源表结构,创建外部表 create table if not exists [目标表名] like [源表名] 示例: create table if not exists dwm_soh_estimate_nopartition_out_snappy like dwm_soh_estimate_n…

10x倍加速PDE的AI求解:元自动解码器求解参数化偏微分方程

研究背景 科学和工程中的许多应用需要求解具有不同方程系数、不同边界条件甚至不同求解域形状的偏微分方程(Partial Differential Equation&#xff0c;PDE)&#xff0c;即需要求解一个方程族而不是单个方程。这类应用经常在反问题求解、控制和优化、风险评估和不确定性量化领域…

C++GUI之wxWidgets(4)-编写应用涉及的类和方法(1)

目录wxApp ClasswxApp::OnInit()wxFrame ClasswxFrame处理的事件wxApp Class 当wxUSE_GUI1时&#xff0c;wxApp类代表应用程序本身。 除了wxAppConsole提供的特性外&#xff0c;它还可以跟踪顶部窗口(SetTopWindow())&#xff0c;并添加了对视频模式的支持&#xff08;SetDisp…