AcWing 3555. 二叉树

news2024/9/28 3:28:50

第一种做法是dfs。但是注意,如果是非常单纯的dfs,要把每个节点可以到达的所有节点都记录下来(父节点+两个子节点)。如果只记录了子节点,没记录父节点,就失去了一个方向,肯定出错。

例如求2和6之间的路径:因为这是一棵树,所以从a到b的路径只有唯一的一条。

void dfs(int cur, int b, int depth){
	if(cur == b){
		ans = depth;
		return ;
	}
	for(int i = 0; i < 3; i++){
		int x = v[cur][i];
		if(x != -1 && !vis[x]) {
			vis[x] = 1;
			dfs(x, b, depth + 1); 
		}
	}
	return ;
}
int main(){
	scanf("%d", &t);
	while(t--){
		int n, m;
		scanf("%d%d", &n, &m);
		memset(v, -1, sizeof(v));
		for(int i = 1; i <= n; i++){
			int a, b;
			scanf("%d%d", &a, &b);
			v[i][0] = a; 
			v[i][1] = b; 
			if(a != -1) v[a][2] = i;
			if(b != -1) v[b][2] = i;
		}
		ans = 0;
		memset(vis, false, sizeof(vis));
		for(int i = 1; i <= m; i++){
			int a, b;
			scanf("%d%d", &a, &b);
			vis[a] = 1;
			dfs(a, b, 0);
			printf("%d\n", ans);
		}
	} 
	return 0;

 但是dfs明显有点麻烦,那么我们使用LCA。

2.LCA:最近公共祖先。在二叉树中找到两个节点的最近的公共根节点。

这题求a和b之间的距离,那么我们在建树的时候就已经算出了每个节点到根节点之间的距离。然后我们来看看根据这个距离数组怎么计算两个节点之间的路径。

 这么画个图是不是就知道怎么通过各个节点到根节点的距离计算任意两点之间的路径了!

那么我们怎么计算各个点到根节点的距离呢?很简单,从它的父节点传递过来一个depth,那么当前节点到根节点的距离一定是父节点的深度+1.

那么我们怎么计算两个点的最近公共祖先呢?很简单,一直去找父亲,直到他们的父亲是同一个人。

好了。现在上代码(这个代码除了输出,看样子就是最简单的lca模板了,积累一下):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
const int N = 1010;
const int M = 1010;
int l[N];
int r[N];
int dep[N];
int p[N];
int n, m, t; 
void dfs(int root){  //找根节点到各个节点的距离
    if(root == -1) return ;
    if(l[root] > 0) dep[l[root]] = dep[root] + 1;
    if(r[root] > 0) dep[r[root]] = dep[root] + 1;
    
    dfs(l[root]);
    dfs(r[root]);
}
int main(){
	scanf("%d", &t);
	while(t--){
		int n, m;
		scanf("%d%d", &n, &m);
		for(int i = 1; i <= n; i++){
			int a, b;
			scanf("%d%d", &a, &b);
			l[i] = a;
			r[i] = b;
			if(a != -1) p[a] = i;
			if(b != -1) p[b] = i;
		}
		dfs(1);
		for(int i = 1; i <= m; i++){
			int a, b;
			scanf("%d%d", &a, &b);
			int x = a;
			int y = b;
			while(a != b){
			    if(dep[a] > dep[b]){
			        a = p[a];
			    }else{
			        b = p[b];
			    }
			}   
			
			printf("%d\n", dep[x] + dep[y] - 2 * dep[a]);
		}
	} 
	
	return 0;
} 

还有用链表的形式查找两个节点的最近公共祖先,代码如下:

TreeNode* lowestCommonAncestor(TreeNode* root,TreeNode* p,TreeNode* q){
    //已经到叶子节点了,找到p或者找到q了,因为值是唯一的,所以在另一半的子树上要么没有,要么剩下其他的
    if(root==NULL||root==p||root==q) return root;   
    TreeNode* left=lowestCommonAncestor(root->left,p,q);  //递归到左子树
    TreeNode* right=lowestCommonAncestor(root->right,p,q);  //递归到右子树
    if(left==NULL&&right==NULL) return NULL;  //都不在树中
    else if(left!=NULL&&right!=NULL) return root;  //左右子树各有一个,那么说明公共祖先是根节点
    else return left==NULL?right:left;
}

就到这吧,我的脑子真的很不好使,但是我应该给我自己一点积极的暗示!

我有一个好脑子!

我有一个好脑子!

我有一个好脑子!

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

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

相关文章

Git常见问题:Your branch and ‘xxx/xxx‘ have diverged

报这个错就是因为你和远程库出现分叉了&#xff0c;具体表现是是由于同一个分支有多人修改&#xff0c;多人commit造成的 用户1操作 用户2操作 T1 git co -b brv_1 git co -b brv_1 T2 git add test2.java git commit -m m2 git push T3 git add test1.java git comm…

VR全景博物馆,打造7*24小时的线上参访体验

导语&#xff1a;博物馆作为人们了解历史、文化和艺术的重要场所&#xff0c;现在可以通过VR全景技术来进行展览&#xff0c;让参观者身临其境地感受历史文化的魅力。本文将介绍博物馆VR全景的特点、优势&#xff0c;以及如何使用VR全景技术来丰富博物馆的展览和教育活动。什么…

数据库:Mysql数据库安装及使用

目录 一、数据库介绍 1、基本概念 2、数据库类型 3、版本演变 二、Mysql安装 1、官网下载yum安装 2、手动配置yum安装 三、Mysql基本操作 1、登录与改密 2、检测数据库健康 3、 库的创建与使用 4、数据类型 5、修饰符 6、表的创建与使用 7、分组查询 8、查询排…

hive之正则函数研究学习regex/regex_replace/regex_extract

首先学习这个之前要先知道一些正则的基本知识。 随便百度一下正则表达式 – 元字符 | 菜鸟教程 字符描述\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如&#xff0c;n 匹配字符 "n"。\n 匹配一个换行符。序列 \\ 匹…

残酷现实:大部分的App小程序,日活<100

残酷现实:99%的APP小程序&#xff0c;日活<100 日活跃用户数量(DAU&#xff09;是一个核心指标 Daily Active Users 互联网的难度系数一路拉高 只有流过血的战士&#xff0c;才能意识到战场的残酷 趣讲大白话&#xff1a;赵本山小品台词&#xff0c; 残酷的现实已直逼我心理…

千访 | 互动千万!小红书博主修炼手册

采访手记&#xff1a; 截止到目前&#xff0c;姜老师的护肤成分室在小红书的粉丝量已达150W。在赛道内卷的美妆区&#xff0c;突破真人出镜讲解&#xff0c;采用二次元漫画&#xff0b;变美内容结合&#xff0c;成为护肤动画领域的头部大号。 接下来&#xff0c;就让我们通过…

[算法]希尔排序——插入排序的升级

参考&#xff1a;《漫画算法-小灰的算法之旅》 目录 1、希尔排序的思想 2、例子 3、希尔排序代码 4、希尔排序的优化 5、希尔排序是不稳定排序 问&#xff1a;什么情况下插入排序的工作量会比较小呢&#xff1f; 答&#xff1a;首先&#xff0c;当数组元素较小时&#xf…

基于Halcon的MLP(多层感知神经网络)分类器分类操作实例

一、介绍 人工神经网络(Artificial Neural Network,ANN)简称神经网络(Neural Network,NN)或类神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 MLP神经网络是一种基于神经网络、动态的分类器。MLP分类器使用神经…

C51---智能感应垃圾桶

1.器件&#xff1a;C51、蜂鸣器、SG90舵机、HC-SR04超声波测距 2.实现功能&#xff1a;超声波感应&#xff0c;舵机转动打开垃圾桶&#xff0c;蜂鸣器发出提示&#xff0c;LED灯亮 3.代码&#xff1a; #include "reg52.h" #include "intrins.h" //距离小…

关于进程与进程调度

目录什么是进程进程管理进程的结构体(PCB)里的属性并行与并发什么是进程 一个运行起来的程序就是进程. 比如文件名是以 exe 结尾的就是一可执行文件(程序) 双击QQ.exe文件, 这个程序就跑起来了, 它在系统中形成了一个进程, 那我们怎么看到进程呢? 可以打开任务管理器, 点开进…

Spark MLlib 模型训练

Spark MLlib 模型训练决策树随机森林GBDTSpark MLlib 开发框架下 : 监督学习 : 回归 (Regression) , 分类 (Classification) , 协同过滤 (Collaborative Filtering)非监督学习 : 聚类 (Clustering) 、频繁项集 (Frequency Patterns) 例子分类 : 算法分类 : 算法分类算法子分类…

探究SMC局部代码加密技术以及在CTF中的运用

前言 近些日子在很多线上比赛中都遇到了smc文件加密技术,比较出名的有Hgame杭电的比赛,于是我准备实现一下这项技术&#xff0c;但是在网上看了很多文章&#xff0c;发现没有讲的特别详细的&#xff0c;或者是无法根据他们的方法进行实现这项技术&#xff0c;因此本篇文章就是…

Springboot怎么快速集成Redis?

前言其实在Springboot中集成redis是一个非常简单的事情&#xff0c;但是为什么要单独输出一篇文章来记录这个过程呢&#xff1f;第一个原因是&#xff0c;我记性不是太好&#xff0c;这次把这个过程记录下&#xff0c;在新的项目搭建的时候或者需要在本地集成redis做一些其他相…

51红外循迹智能车——红外循迹模块设计

目录 赛道环境 红外传感器的特征 TCRT5000传感器 LM339单限电压比较器 LM339简介 ​编辑 单限电压比较器仿真 红外循迹模块的设计 红外循迹模块原理图 红外循迹模块原理图讲解 赛道环境 上图为赛道示意图&#xff0c;两端为黑色&#xff0c;中间为白色 红外传感器的…

小孩用什么样的台灯比较好?2023眼科医生青睐的儿童台灯推荐

小孩子属于眼睛比较脆弱的人群&#xff0c;所以选购护眼台灯时&#xff0c;选光线温和的比较好&#xff0c;而且调光、显色效果、色温、防蓝光等方面也要出色&#xff0c;否则容易导致孩子近视。 1、调光。台灯首先是照度高&#xff0c;国AA级&#xff0b;大功率发光&#xff0…

Yolov5目标检测算法解析:模型结构

Yolov5系列是Yolo家族新一代的模型&#xff0c;相比于之前的版本Yolov3和Yolov4&#xff0c;相同的是&#xff0c;它依然采用锚框&#xff08;anchor&#xff09;对目标的尺寸进行回归的思想&#xff0c;保持大中小多种尺度特征输出&#xff0c;所不同的是&#xff0c;Yolov5系…

SQL 进阶刷题笔记

SQL 进阶刷题笔记 一、MySQL 进阶 这里主要是 MySQL 刷题相关笔记&#xff0c;方便后面温习和查阅&#xff0c;希望可以帮到大家&#xff01;&#xff01;&#xff01; 题1 请计算每张SQL类别试卷发布后&#xff0c;当天5级以上的用户作答的人数uv和平均分avg_score&#xff0…

TCP和UDP对比

TCP和UDP对比 UDP(用户数据报协议) 无连接(指的是逻辑连接关系,不是物理上的连接) 支持单播、多播以及广播,也就是UDP支持一对一、一对多、一对全 面向应用报文的,对应用层交付的报文直接打包 无连接不可靠的传输服务(适用于IP电话、视频会议等实时应用),不使用流量控制和…

易优cms range 范围判断标签

range 范围判断标签 【基础用法】 标签&#xff1a;range 描述&#xff1a;范围判断标签包括in notin between notbetween四个标签&#xff0c;都用于判断变量是否中某个范围。 用法&#xff1a; {eyou:range name$eyou.field.typeid value1,2,3,4 typein} 输出内容 {/e…

HTTPS加密解析

日升时奋斗&#xff0c;日落时自省 目录 1、加密解释 2、对称加密 3、非对称加密 4、证书 HTTPS&#xff08;HyperText Transfer Protocol over Secure Socket Layer&#xff09;也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层 HTTP协议内容都是按…