当前位置:网站首页>Complete Binary Tree
Complete Binary Tree
2022-07-27 04:43:00 【小L~~~】
Given a tree, you are supposed to tell if it is a complete binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤20) which is the total number of nodes in the tree – and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a - will be put at the position. Any pair of children are separated by a space.
Output Specification:
For each case, print in one line YES and the index of the last node if the tree is a complete binary tree, or NO and the index of the root if not. There must be exactly one space separating the word and the number.
Sample Input 1:
9
7 8
- -
- -
- -
0 1
2 3
4 5
- -
- -
Sample Output 1:
YES 8
Sample Input 2:
8
- -
4 5
0 6
- -
2 3
- 7
- -
- -
Sample Output 2:
NO 1
题目大意:
判断一棵树是不是完全二叉树,是的话输出YES和最后一个结点,否则输出NO和根节点。
王道书上同样有相同的一道算法题,算法的思路都一样,只是王道书上要求的树是用二叉链表存储结构存储的。
思路:
采用层次遍历算法,将所有结点加入队列(包括空结点)。遇到空结点时,看其后是否有非空结点。若有,则二叉树不是完全二叉树。
#include<bits/stdc++.h>
using namespace std;
struct Complete_Binary_Tree
{
int data;
int lchild, rchild;
}node[25];
int n;
bool visited[25] = {
false};
int turn(string s) {
int sum = 0;
for(auto &i:s) sum = sum * 10 + (i - '0');
return sum;
}
int build_tree() {
scanf("%d", &n);
for(int i = 0; i < n; i++) {
string left, right;
cin >> left >> right;
node[i].data = i;
if(left == "-") node[i].lchild = -1;
else {
node[i].lchild = turn(left);
visited[node[i].lchild] = true;
}
if(right == "-") node[i].rchild = -1;
else {
node[i].rchild = turn(right);
visited[node[i].rchild] = true;
}
}
for(int i = 0; i < n; i++) {
if(!visited[i]) return i;//返回根节点
}
}
int last_node = 0;
bool iscomplete(int root) {
queue<int>q;
if(n == 0) return true; // 空树为满二叉树
q.push(root);
while (!q.empty())
{
int top = q.front();
q.pop();
if(top != -1) last_node = top;
if(top != -1) {
q.push(node[top].lchild);
q.push(node[top].rchild);
} else {
// 结点为空,检查其后是否有非空结点
while(!q.empty()) {
int temp = q.front();
q.pop();
if(temp != -1) return false; // 结点非空,则二叉树为非完全二叉树
}
}
}
return true;
}
int main() {
int root = build_tree();
// for(int i = 0; i < n; i++) cout << node[i].lchild << " " << node[i].rchild << endl;
// cout << root << endl;
if(iscomplete(root)) printf("YES %d", last_node);
else printf("NO %d", root);
return 0;
}
边栏推荐
- 【报错】Cannot read property ‘parseComponent‘ of undefined
- The execution process of a select statement in MySQL
- 小程序项目如何创建
- 消防安全培训资料汇总
- [C language] detailed explanation of user-defined types (structure + enumeration + Union)
- Interesting C language
- 2019强网杯upload
- 2022 T2i text generated image Chinese Journal Paper quick view-1 (ecagan: text generated image method based on channel attention mechanism +cae-gan: text generated image technology based on transforme
- Comprehensive experiment of static routing
- 安装Pygame
猜你喜欢
随机推荐
Approval of meeting OA
关于gorm的BeforeDelete钩子方法不生效的问题
kali系统arp介绍(断网嗅探密码抓包)
The usage syntax and scene of selector, as well as the usage of background picture size, text box shadow and excessive effect
On the problem that Gorm's beforedelete hook method does not work
C language address book management system (linked list, segmented storage of mobile phone numbers, TXT file access, complete source code)
Safety fourth after class exercise
C language - two dimensional array, pointer
[search] connectivity model of DFS + search order
TCP's three handshakes and four waves
【搜索】DFS之连通性模型 + 搜索顺序
使用Photoshop出现提示“脚本错误-50出现一般Photoshop错误“
How does PS import LUT presets? Photoshop import LUT color preset tutorial
"Photoshop2021 introductory tutorial" flatten "perspective images
【牛客讨论区】第七章:构建安全高效的企业服务
[search] flood fill and shortest path model
Cache read / write policies: cacheside, read/writethrough and writeback policies
事件(event)
vim的基本操作
Photoshop提示暂存盘已满怎么办?ps暂存盘已满如何解决?









