惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Help Net Security
云风的 BLOG
云风的 BLOG
Apple Machine Learning Research
Apple Machine Learning Research
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
博客园 - Franky
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
量子位
V
Visual Studio Blog
Y
Y Combinator Blog
小众软件
小众软件
N
Netflix TechBlog - Medium
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
雷峰网
雷峰网

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
洛谷P15801[GESP202603 六级]完全二叉树
小汪同学^_^ · 2026-05-17 · via 博客园_首页

还是题目传送门

这题说实话,雀食很难。(我才不会告诉你我想了1个多小时)我认(kan)真(le)思(ti)考(jie)才知道这题要用DFS传输3个数据:是否为完全二叉树、是否为满二叉树、深度。

Solution

要知道这颗子树是否为完全二叉树,要判断这几个条件:

当自己的两颗子树深度相同时

1.当右子树为满二叉树且左子树也为满二叉树
2.当右子树为满二叉树且左子树为完全二叉树

当自己的两颗子树深度差为1时(且左子树较深)

1.当左子树为满二叉树且右子树也为满二叉树
2.当左子树为满二叉树且右子树为完全二叉树

如果不满足上述条件,则该子树不为完全二叉树,否则,该子树则为完全二叉树(第一种情况也为满二叉树)。

注意点

1.空树不仅是完全二叉树,也是满二叉树,只是深度为0。
2.要特判一下叶子节点。

AC Code

#include<bits/stdc++.h>
using namespace std;
int n, ans = 0;
struct node{
	int lc;
	int rc;
}a[100020];
struct tj{
	int h;
	bool w;
	bool m;
};
tj sc(int d){
	if(a[d].lc == 0 && a[d].rc == 0){
		ans++;
		return {1, 1, 1};
	} 
	tj c1, c2;
	if(a[d].lc != 0){
		c1 = sc(a[d].lc);
	} else {
		c1 = {0, 1, 1};
	}
	if(a[d].rc != 0){
		c2 = sc(a[d].rc);
	} else {
		c2 = {0, 1, 1};
	}
	if(c1.h == c2.h){
		if(c1.m){
			if(c2.w){
				if(c2.m){
					ans++;
					return {c1.h + 1,1,1};
				}
				else{
					ans++;
					return {c1.h + 1,1,0};
				}
			}
			else{
				return {c1.h + 1,0,0};
			}
		} 
		else {
			return {c1.h + 1,0,0};
		}
	}
	else if(c1.h - 1 == c2.h){
		if(c2.m){
			if(c1.w){
				if(c1.m){
					ans++;
					return {c1.h + 1, 1, 0};
				} else {
					ans++;
					return {c1.h + 1, 1, 0};
				}
			} else {
				return {c1.h + 1, 0, 0};
			}
		} else {
			return {c1.h + 1, 0, 0};
		}
	} else {
		return {max(c1.h, c2.h) + 1, 0, 0};
	}
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++)
		cin >> a[i].lc >> a[i].rc;
	sc(1);
	cout << ans;
	return 0;
}

总结

本题比较难想,富有逻辑,需要仔细思考。