AcWing 1600:完全二叉树

news2024/11/16 12:55:49

【题目来源】
https://www.acwing.com/problem/content/1602/

【题目描述】
给定一个树,请你判断它是否是完全二叉树。

【输入格式】
第一行包含整数 N,表示树的结点个数。
树的结点编号为 0∼N−1。
接下来 N 行,每行对应一个结点,并给出该结点的左右子结点的编号,如果某个子结点不存在,则用 - 代替。

【输出格式】
如果是完全二叉树,则输出 YES 以及最后一个结点的编号。
如果不是,则输出 NO 以及根结点的编号。

【数据范围】
1≤N≤20

【输入样例1】
9
7 8
- -
- -
- -
0 1
2 3
4 5
- -
- -

【输出样例1】
YES 8

【输入样例2】
8
- -
4 5
0 6
- -
2 3
- 7
- -
- -

【输出样例2】
NO 1

【算法分析】
● 树的结点编号为 0∼N−1,而 1≤N≤20,所以结点编号是有二位数的,编码时要注意处理。
●​​​​​​​ 字符 ‘0’~‘9’ 转数字。例如,利用 ‘9’
-‘0’ 得到数字 9。其他以此类推。
●​​​​​​​ 样例 1 及样例 2 对应的二叉树如下所示。显然,样例 1 是一个完全二叉树。

●​​​​​​​ 本例中,输入样例的行数,事实上就是结点的编号。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int N=25;
struct node {
    int le,ri;
    int id;
} tr[N];
bool st[N];

int n;
int idx;
int maxv;

void check(int u,int k) { //find last node
    if(u==-1) return;
    if(k>maxv) {
        maxv=k;
        idx=u;
    }
    check(tr[u].le,2*k);
    check(tr[u].ri,2*k+1);
}

int main() {
    cin>>n;
    for(int i=0; i<n; i++) { //id from 0 to n-1
        string a,b;
        cin>>a>>b;

        if(a!="-") {
            int t=0;
            for(int i=0; i<a.size(); i++)
                t=t*10+(a[i]-'0'); //Convert string to number
            tr[i].le=t;
            st[tr[i].le]=true;
        } else tr[i].le=-1;

        if(b!="-") {
            int t=0;
            for(int i=0; i<b.size(); i++)
                t=t*10+(b[i]-'0'); //Convert string to number
            tr[i].ri=t;
            st[tr[i].ri]=true;
        } else tr[i].ri=-1;

        tr[i].id=i;
    }

    int root=-1;
    for(int i=0; i<n; i++) {
        if(!st[i]) {
            root=i;
            break;
        }
    }

    check(root,1);

    if(maxv==n) cout<<"YES "<<idx<<endl;
    else cout<<"NO "<<root<<endl;

    return 0;
}

/*
in:
9
7 8
- -
- -
- -
0 1
2 3
4 5
- -
- -

out:
YES 8

---------

in:
8
- -
4 5
0 6
- -
2 3
- 7
- -
- -

out:
NO 1
*/




【参考文献】
https://www.acwing.com/solution/content/97561/



 

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

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

相关文章

查看和修改自己的git提交时的作者信息

首先查看自己本地配置的信息:git config --list 修改姓名和邮箱: 配置用户名 git config --global user.name "真实姓名" 配置邮箱 git config --global user.email "公司分配的企业邮箱" 示例 git config --global user.name "张三" git…

linux网络项目——基于WebServer的工业数据采集项目

一、项目目标和框图 项目目标&#xff1a;实现通过网页控制信息采集和通过网页控制灯泡和蜂鸣器的亮灭 二、项目分析 1.服务器源码分析 初始化服务器循环等待连接&#xff0c;连接后创建线程&#xff0c;调用线程函数msg_request&#xff0c;在函数中调用handler_msg函数分析…

AI大模型探索之路-实战篇10:数据预处理的艺术:构建Agent智能数据分析平台的基础

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

Web开发中,就session和cookie相比,用session比用cookie的优点有哪些?

在Web项目中&#xff0c;session和cookie都是用于存储用户数据的机制&#xff0c;但它们有不同的优缺点。使用session比使用cookie有以下几个主要优点&#xff1a; 1. 安全性更高 敏感数据保护&#xff1a;Session数据存储在服务器端&#xff0c;而不是客户端。这样&#xff…

什么叫USDT(泰达币)的前世今生!

一、引言 在数字货币的世界里&#xff0c;USDT&#xff08;Tether USDT&#xff09;以其独特的稳定机制&#xff0c;成为了连接传统金融市场与加密货币市场的桥梁。本文将带您了解USDT的诞生背景、发展历程、技术特点以及未来展望。 二、USDT的诞生背景 USDT是Tether公司推出…

QT::QNetworkReply类readAll()读取不到数据的可能原因

程序中&#xff0c;当发送请求时&#xff0c;并没有加锁&#xff0c;而是在响应函数中加了锁&#xff0c;导致可能某个请求的finished信号影响到其他请求响应数据的读取 connect(reply,&QNetworkReply::finished,this,&Display::replyFinished);参考这篇文章&#xff…

5.28.1 使用卷积神经网络检测乳腺癌

深度学习技术正在彻底改变医学图像分析领域&#xff0c;因此在本研究中&#xff0c;我们提出了卷积神经网络 (CNN) 用于乳腺肿块检测&#xff0c;以最大限度地减少手动分析的开销。CNN 架构专为特征提取阶段而设计&#xff0c;并采用了更快的 R-CNN 的区域提议网络 (RPN) 和感兴…

windows镜像虚拟机创建共享文件夹详细步骤 -- 和本地电脑传输文件

第一步&#xff1a;关闭客户机 第二步&#xff1a;右击“虚拟机名称”或菜单栏的“虚拟机”–>“设置” 网络适配器选择NAT或者其他的都可以 来到“选项”&#xff0c;启用共享文件夹&#xff0c;具体如下图&#xff1a;点击添加&#xff0c;添加主机文件夹。然后确定 第三步…

第3章 数据链路层

王道学习 考纲内容 &#xff08;一&#xff09;数据链路层的功能 &#xff08;二&#xff09;组帧 &#xff08;三&#xff09;差错控制 检错编码&#xff1b;纠错编码 &#xff08;四&#xff09;流量控制与可靠传输机制 流量控制、可靠传输与滑动窗口…

怎么藏族翻译中文在线翻译?更好地了解藏族文化

怎么藏族翻译中文在线翻译&#xff1f;着全球化的发展&#xff0c;语言交流的重要性日益凸显。藏族&#xff0c;作为中国的一个古老而神秘的民族&#xff0c;其语言对于很多人来说充满了神秘感。然而&#xff0c;在今天的数字化时代&#xff0c;我们有了更多的工具来打破语言壁…

Pytorch-Reduction Ops

文章目录 前言1.torch.argmax()2.torch.argmin()3.torch.amax()4.torch.amin()5.torch.all()6.torch.any()7.torch.max()8.torch.dist()9.torch.logsumexp()10.torch.mean()11.torch.norm()12.torch.nansum()13.torch.prod()14.torch.cumsum()15.torch.cumprod() 前言 1.torch.…

Vue 实例

一、页面效果图 二、代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><script src"../vue.js" type"text/javascript"></script><title>vue 实例</title></head><body>&l…

Jmeter 安装教程:简单易懂

随着互联网的不断发展&#xff0c;网站和应用程序的性能测试变得越来越重要。Apache JMeter 是一款广泛使用的性能测试工具&#xff0c;它强大且使用广泛&#xff0c;适用于各种性能测试需求。不论你是刚刚接触性能测试的新手&#xff0c;还是一位有经验的测试工程师&#xff0…

【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ORB_SLAM3源码编译二、ORB_SLAM3实时单目相机测试1. 查看摄像头的话题2. 运行测试 三. 运行测试可能的报错1. 报错一(1) 问题描述(2) 原因分析(3) 解决 2. …

redis--集群节点维护

添加节点 因公司业务发展迅猛&#xff0c;现有的三主三从redis cluster架构可能无法满足现有业务的并发写入需求&#xff0c;因此公司紧急采购一台服务器192.168.7.107&#xff0c;需要将其动态添加到集群当中其不能影响业务使用和数据丢失&#xff0c;则添加过程如下: 同步之…

适合多种苛刻环境的惯性测量单元M-G370PDS

全球IMU市场d在汽车和机器人技术进步和不断增长的应用需求&#xff0c;保持着高速增长的趋势&#xff0c;其中航空航天、国防和汽车等行业对高精度、稳定和紧凑的IMU需求尤为强烈&#xff0c;这些行业对精度和可靠性的高要求直接影响了相关技术的发展方向。 爱普生惯性测量单…

【错题集-编程题】天使果冻(递推)

牛客对应题目链接&#xff1a;天使果冻 (nowcoder.com) 一、分析题目 预处理 递推 / 动态规划 f[i]&#xff1a;表示前 i 个数中的最大值。g[i]&#xff1a;表示前 i 个数中的第二大的值。 状态转移方程&#xff1a; f[i] max(f[i-1], arr[i]);arr[i] > f[i-1]&#xf…

实用新型专利申请被驳回原因

实用新型专利作为知识产权的重要组成部分&#xff0c;对推动技术创新和产业发展具有重要意义。然而&#xff0c;在申请实用新型专利的过程中&#xff0c;有时会遇到被驳回的情况。 实用新型专利被驳回的一个常见原因是技术方案不具备新颖性、创造性和实用性等专利授权条件。专利…

如何使用SSRFire自动扫描和发现SSRF漏洞

关于SSRFire SSRFire是一款针对SSRF漏洞的自动化漏洞挖掘工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员只需要给该工具提供一个目标域名和服务器信息&#xff0c;SSRFire将帮助我们自动挖掘出潜在的SSRF漏洞。除此之外&#xff0c;该工具还可以挖掘XSS以及开放重…

c语言 分而治之(施特拉森矩阵乘法)

给定两个大小分别为 nxn 的方阵 A 和 B&#xff0c;求它们的乘法矩阵。 朴素方法&#xff1a;以下是两个矩阵相乘的简单方法。 void multiply(int A[][N], int B[][N], int C[][N]) { for (int i 0; i < N; i) { for (int j 0; j < N; j) { …