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 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
题目大意:给出一个二叉树,判断是否是完全二叉树。
//这个题真的学到了不少东西。我的AC:
参照了:https://blog.csdn.net/hyf20144055065/article/details/51970789
#include <iostream> #include <algorithm> #include<cstdio> #include<stdio.h> #include <queue> #include<cmath> #include <vector> using namespace std; struct Node{ int left=-1,right=-1; }node[20]; int isr[20]; int root=-1; int ct=0,n,last=0; void level(int r){//进行层次遍历。我是选择在入队的时候+,但是这样是比较复杂的,我应该在出队的时候+。 queue<int> qu; qu.push(r); //ct++; while(!qu.empty()){ //if(ct==n)last=qu.back(); int top=qu.front();qu.pop(); if(top==-1)break; last=top;//每次last都赋值为当前。 ct++; // if(node[top].left==-1)break; // else { // qu.push(node[top].left); // ct++; // } qu.push(node[top].left);//其实这里-1完全可以push进去,因为下一次再次弹出时会进行判断的。 qu.push(node[top].right); // if(node[top].left!=-1){ // qu.push(node[top].right); // ct++; // } } } int main() { cin>>n; string l,r; for(int i=0;i<n;i++){ cin>>l>>r; if(l!="-"){ node[i].left=atoi(l.c_str());//注意这里的转换 //cout<<node[i].left<<'\n'; isr[node[i].left]=1; } if(r!="-"){ node[i].right=atoi(r.c_str()); isr[node[i].right]=1; } } for(int i=0;i<n;i++){ if(isr[i]==0){ root=i;break; } } level(root); if(ct==n) cout<<"YES "<<last; else cout<<"NO "<<root; return 0; }
1.利用完全二叉树的性质来判断。
2。使用了层次遍历,但是我的层次遍历思路是不正确的。
3.我的思路:只要有左子节点就push进去,然后计数+1,是在入队的时候计算数量。只要左子节点为-1,那么就break掉。
4.正确思路:当节点左右为空-1时,可以push进去,在whlle循环中会进行判断,如果是-1,那么就break了,是在出队的时候进行+1操作,这样最后就可以了
5.在我原来的那种方法中,2和6测试点过不去,对于6测试点:
使用了
1
- -
测试数据进行了更正
2测试点是对于0的检测。
正确输出应该是YES 0