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

【算法】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的下一个节点指向b
	e[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) // 递归到结尾返回true
		return true;
	else if (mp[e[p]] == 0 || mp[e[q]] == 0) // 两个孩子有一个为空返回false
		return false;
	else if (mp[e[p]] != mp[e[q]]) // 左孩子和右孩子不相同返回false
		return 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) // 没有节点,返回0
		return 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;// 防止逆向dfs
		int 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开始dfs
	dfs(1);
	cout << max_n << endl;
	return 0;
}

http://www.kler.cn/a/401197.html

相关文章:

  • 一个交替优化问题的求解
  • https(day30)
  • C# DataTable使用Linq查询详解
  • prop校验,prop和data区别
  • 【MySql】实验十六 综合练习:图书管理系统数据库结构
  • 【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)
  • 基于YOLOv8深度学习的智慧课堂教师上课行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
  • gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突
  • 《原子与分子物理学报》
  • 玩转view和text组件与相关动画的使用
  • 如何在 Ubuntu 上设置 JAVA_HOME 环境变量 ?
  • 青蛙跳台阶
  • Python酷库之旅-第三方库Pandas(229)
  • MySQL数据库学习(持续更新ing)
  • Qt MDI与Splash介绍
  • 使用pandoc将latex转换成word(带参考文献)
  • uni-app获取安全区域
  • 基于centos7.9搭建tmall商城
  • GRU(门控循环单元)详解
  • 图片画廊4 -- 使用Owl Carousel进行优化
  • 探索Python PDF处理的奥秘:pdfrw库揭秘
  • 设计模式之组合模式(营销差异化人群发券,决策树引擎搭建场景)
  • Excel——宏教程(2)
  • 基于Matlab的变压器仿真模型的建模方法(2):单相双绕组变压器的状态方程和仿真模型(附源代码)
  • 分享一下arr的意义(c基础)
  • 【UNIAPP】uniapp版图片压缩工具