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 8Sample Input 2:
8 - - 4 5 0 6 - - 2 3 - 7 - - - -Sample Output 2:
NO 1
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <cstdlib>
using namespace std;
struct node{
int left,right;
node(int l = -1,int r = -1):left(l),right(r){}
};
int str2int(const string &s){
if(s[0] == '-')return -1;
return (int)strtol(s.c_str(),NULL,10);
}
int lastnode=0;
vector<int> head;
vector<node> tree;
bool is_bst(int r){
queue<int> que;
que.push(r);
int la = r;
while(que.empty() == false){
int q = que.front();
que.pop();
if(q == -1){
while(que.empty() == false){
if(que.front() != -1)
return false;
que.pop();
}
lastnode=la;
return true;
}
que.push(tree[q].left);
if(tree[q].left != -1)la = tree[q].left;
que.push(tree[q].right);
if(tree[q].right != -1)la = tree[q].right;
}
}
int main(){
int n,l,r;
cin>>n;
tree.resize(n);head.resize(n);
for(int i=0;i<n;i++){
string left,right;
cin>>left>>right;
l = str2int(left);r = str2int(right);
tree[i].left = l;
tree[i].right = r;
if(l!=-1)head[l]=1;
if(r!=-1)head[r]=1;
}
int root;
for(int i=0;i<n;i++){
if(head[i] ==0){
root = i;break;
}
}
if(is_bst(root)){
cout<<"YES "<<lastnode<<endl;
}else
cout<<"NO "<<root<<endl;
system("pause");
return 0;
}