AcWing 1600:完全二叉树

2024-05-30 03:36
文章标签 二叉树 完全 acwing 1600

本文主要是介绍AcWing 1600:完全二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目来源】
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 nodeif(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-1string 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 numbertr[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 numbertr[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/



 

这篇关于AcWing 1600:完全二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015469

相关文章

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新,但是每一次迭代的话我不一定每条边都会更新,SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话,那么一定是dist[a]变小了,只有a变小了,a的后继(b)才会变小。 用宽搜来做优化,用一个队列,队列里边存的就是所有变小了的结点(队列里存的是待更新的点)。 基本思路就是我更新过谁,我再拿

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

uva674(完全背包)

题意: 有5种硬币1,5,10,25,50,;现在随意的给出一个价钱,问你有几种组合方式! 输入11 输出4 1+...+1(10个),5+(6*1),5+5+1,  10+1(共4种) 思路; 满足完全背包思想,状态转移方程:dp[i+num[k]] += dp[i](dp[i]为组合成i的不重复种数,num[k]分别为1,5,10,25,50)不能合在一起转移,否则会导致重复!

【AcWing】852. spfa判断负环

#include<iostream>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int N= 1e5+10;int n,m;int h[N],w[N],e[N],ne[N],idx;int dist[N],cnt[N];//cnt存最短路径的边数bool st[N];v