当前位置: 首页 > news >正文

【算法】P5018 对称二叉树

题目

P5018 对称二叉树
https://www.luogu.com.cn/problem/P5018

代码

思路:领接表存储二叉树,unordered_map存储各个节点对应的值。dfs遍历一下各个子树的大小个数,再写个递归判断是否是对称二叉树,如果是就更新全局答案。

#include <bits/stdc++.h>
#define endl '\n'using namespace std;const int N = 1e7 + 10;// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点(也就是邻接表)
int e[N], ne[N], h[N], st1[N], idx;unordered_map<int, int> mp;// 每个结点id对应的值
int max_n = 0; // 最大对称二叉树节点数量// 邻接表初始化
void init() {memset(h, -1, sizeof h);idx = 0;
}// 添加一条边a->b 
void add(int a, int b) {// 存下b的值,b下一个指向a的下一个节点,a的下一个节点指向be[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}//p, q是指针
bool check(int p, int q) {if (mp[e[p]] == 0 && mp[e[q]] == 0) // 递归到结尾返回truereturn true;else if (mp[e[p]] == 0 || mp[e[q]] == 0) // 两个孩子有一个为空返回falsereturn false;else if (mp[e[p]] != mp[e[q]]) // 左孩子和右孩子不相同返回falsereturn false;return check(h[e[p]], ne[h[e[q]]]) && check(ne[h[e[p]]], h[e[q]]); // 左右两颗子树开始递归
}int dfs(int u) {if (mp[u] == 0) // 没有节点,返回0return 0;st1[u] = true;// st[u] 表示点u已经被遍历过int sum = 0;for (int i = h[u]; i != -1 ; i = ne[i]) {int j = e[i];if (st1[j]) continue;// 防止逆向dfsint s = dfs(j);sum += s; // 累加左孩子右孩子节点数}// 检查是不是对称二叉树,并更新答案if (check(h[u], ne[h[u]])) {max_n = max(max_n, sum + 1);}return sum + 1; // 返回当前节点的左孩子右孩子所有结点数+1
}int main() {cin.tie(0), cout.tie(0);init();mp[-1] = 0;int n;cin >> n;// 每个节点存下节点值for (int i = 1; i <= n; i ++) {int v;cin >> v;mp[i] = v;}// 插入左孩子右孩子for (int i = 1; i <= n; i ++) {int l, r;cin >> l >> r;add(i, r);add(i, l);}// 从1开始dfsdfs(1);cout << max_n << endl;return 0;
}
http://www.lryc.cn/news/487601.html

相关文章:

  • Unifying Top-down and Bottom-up Scanpath Prediction Using Transformers
  • JavaSE(十四)——文件操作和IO
  • 【视觉SLAM】4b-特征点法估计相机运动之PnP 3D-2D
  • android 性能分析工具(04)Asan 内存检测工具
  • html中select标签的选项携带多个值
  • Lambda表达式如何进行调试
  • C++ —— 剑斩旧我 破茧成蝶—C++11
  • HTML5好看的音乐播放器多种风格(附源码)
  • C++设计模式行为模式———迭代器模式中介者模式
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十五,解码相关,将h264文件进行帧分隔变成avpacket
  • 力扣 LeetCode 104. 二叉树的最大深度(Day7:二叉树)
  • 如何高效实现汤臣倍健营销云数据集成到SQLServer
  • Vue3中使用:deep修改element-plus的样式无效怎么办?
  • 具身智能之Isaac Gym使用
  • 【大数据学习 | Spark】spark-shell开发
  • 《Python制作动态爱心粒子特效》
  • Jmeter 如何导入证书并调用https请求
  • Python程序15个提速优化方法
  • 足球虚拟越位线技术FIFA OT(二)
  • centos7.9单机版安装K8s
  • 图像编辑一些概念:Image Reconstruction与Image Re-generation
  • 【STM32】在 STM32 USB 设备库添加新的设备类
  • 【Redis】Redis实现的消息队列
  • # Spring事务
  • Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找
  • ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
  • 7.STM32之通信接口《精讲》之USART通信---多字节数据收发(数据包的模式:HEX数据包和文本数据包)
  • 基于Vue+SpringBoot的求职招聘平台
  • WebRTC 和 WebSocket
  • 小车综合玩法--5.画地为牢