1110 Complete Binary Tree(25 分)

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 NOand 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

题目大意:给出一棵树二叉树,判断是否是完全二叉树,如果是那么输出最后一个节点;如果不是输出根节点。

//第一次见完全二叉树的题目,想起了完全二叉树的性质,存储树的话,就用结构体数组,下标表示当前节点号;首先求出树的高度根据logn,看是否余数为0,判断是否+1;那么前n-1层的节点要是满的,并且再通过只有一个左子节点或者右子节点的树只有一个,那么来判断是否是完全二叉树;并且结构体里有一个属性是father默认为-1。感觉好复杂,就没有用代码实现。

代码来自:https://www.liuchuo.net/archives/2158

#include <iostream>
#include <queue>
#include <vector>
#include <string>
using namespace std;
struct TREE {
int left, right;
};
int main() {
int n, root = ;
scanf("%d", &n);
vector<TREE> tree(n);
vector<int> book(n);
for(int i = ; i < n; i++) {
string l, r;
cin >> l >> r;//使用字符串读取,也必须使用字符串,
if(l == "-") {
tree[i].left = -;//如果左右为空的话,则标记为-1.
} else {
tree[i].left = stoi(l);//不用使用-'0'将其转换,直接使用stoi函数即可
book[tree[i].left] = ;
}
if(r == "-"){
tree[i].right = -;
} else {
tree[i].right = stoi(r);
book[tree[i].right] = ;
}
}
for(int i = ; i < n; i++) {
if(book[i] == ) {
root = i;
break;//没有出现的便是根!
}
}
queue<int> q;
q.push(root);
int cnt = , lastnode = ;
while(!q.empty()) {
int node = q.front();
q.pop();
if(node != -) {
lastnode = node;
cnt++;//记录层次遍历在-1出现之前的节点数
}else {
if(cnt != n)
printf("NO %d", root);
else
printf("YES %d", lastnode);
return ;
}
q.push(tree[node].left);//如果左右子节点为空,那么就将-1push进去了
q.push(tree[node].right);
}
return ;
}

//学习了!

1.根据输入建树,每个节点因为本身就是ID,左右如果是空节点,那么就赋值为-1.

2.根节点是怎么找到的呢?在建树输入的过程中,如果一个点没有出现,那么就是根节点,因为都在一棵树中!都是表示的是子节点,如果没出现,就表示它不是子节点,而是根节点!

3.如何去判断是否是CBT呢?使用层次遍历!并且记录当前层次遍历的个数,根据CBT的性质,如果当前出现空节点,但是遍历过的点数!=总结点数,那么就不是二叉树,可以画一个图试试!使用队列!

//学习了!

PAT 1110 Complete Binary Tree[判断完全二叉树]的更多相关文章

  1. PAT 1110 Complete Binary Tree[比较]

    1110 Complete Binary Tree (25 分) Given a tree, you are supposed to tell if it is a complete binary t ...

  2. PAT 1110 Complete Binary Tree

    Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...

  3. [二叉树建树&完全二叉树判断] 1110. Complete Binary Tree (25)

    1110. Complete Binary Tree (25) Given a tree, you are supposed to tell if it is a complete binary tr ...

  4. PAT甲级——1110 Complete Binary Tree (完全二叉树)

    此文章同步发布在CSDN上:https://blog.csdn.net/weixin_44385565/article/details/90317830   1110 Complete Binary ...

  5. 1110 Complete Binary Tree (25 分)

    1110 Complete Binary Tree (25 分) Given a tree, you are supposed to tell if it is a complete binary t ...

  6. 1110 Complete Binary Tree

    1110 Complete Binary Tree (25)(25 分) Given a tree, you are supposed to tell if it is a complete bina ...

  7. PAT A1110 Complete Binary Tree (25 分)——完全二叉树,字符串转数字

    Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...

  8. PAT 甲级 1110 Complete Binary Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805359372255232 Given a tree, you are ...

  9. PAT Advanced 1110 Complete Binary Tree (25) [完全⼆叉树]

    题目 Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each ...

随机推荐

  1. ubuntu网页无法看视频

    sudo apt-get install flashplugin-nonfree sudo apt-get install aptitude sudo aptitude install ubuntu- ...

  2. oracle_存储过程_有参数_获取部门装置层级树

    create or replace procedure P_UTIL_TREE(P_APPL_NAME in VARCHAR2, P_HIERARCHY_TYP in VARCHAR2, TREETY ...

  3. day15<集合框架>

    集合框架(对象数组的概述和使用) 集合框架(集合的由来及集合继承体系图) 集合框架(Collection集合的基本功能测试) 集合框架(集合的遍历之集合转数组遍历) 集合框架(Collection集合 ...

  4. windows平台的游戏运行库

    每一个都在PC上玩过游戏的人,都知道要安装一些必备的游戏运行库,游戏才能运行,这里指的PC是特指Windows操作系统平台.一般来说最常见的运行库是DirectX.Microsoft Visual C ...

  5. Lua脚本和C++交互(二)

    上一节讲了一些基本的Lua应用,下面,我要强调一下,Lua的栈的一些概念,因为这个确实很重要,你会经常用到.熟练使用Lua,最重要的就是要时刻知道什么时候栈里面的数据是什么顺序,都是什么.如果你能熟练 ...

  6. Delphi数据类型转换

    [转]Delphi数据类型转换 DateTimeToFileDate        将DELPHI的日期格式转换为DOS的日期格式 DateTimeToStr              将日期时间格式 ...

  7. OpenLayers基础知识:

     OpenLayers是一个开源的js框架,用于在您的浏览器中实现地图浏览的效果和基本的zoom,pan等功能.OpenLayers支持的地图来源 包括了WMS,GoogleMap,KaMap,MSV ...

  8. MQTT的学习研究(十二) MQTT moquette 的 Future API 消息发布订阅的实现

    MQTT moquette 的Server发布主题 package com.etrip.mqtt.future; import java.net.URISyntaxException; import  ...

  9. LeetCode - Delete Duplicate Emails

    Discription:Write a SQL query to delete all duplicate email entries in a table named Person, keeping ...

  10. deferred对象(摘自别人的文章)

    对jQuery中的deferred对象的整体认识: Deferred是个工厂类,返回的是内部构建的deferred对象 tuples 创建三个$.Callbacks对象,分别表示成功,失败,处理中三种 ...