题目分析
分析:
按照层序的顺序将完全二叉树存在下标从1开始的数组中。如果是完全二叉树,会将数组中1 ~ n这些位置填满,最大下标就是n,如果最大下标大于n,说明中间有空的,就不是完全二叉树。
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 30;
int n;
bool has_father[N]; //找根结点,根结点的特点是:没有父节点
int l[N], r[N];
int max_k;//点在数组中的最大下标
int max_id; //最后一个结点的编号
//u是结点编号,k是结点下标
void dfs(int u ,int k){
if( u == -1) return;
//如果下标大于最大下标,就更新之
//同时最后节点的编号max_id也随之更新
if(k > max_k) max_k = k , max_id = u;
dfs(l[u], 2*k); //左子树,结点下标 2*k
dfs(r[u], 2*k +1); 右子树,结点下标 2*k +1
}
int main(){
memset(l ,-1 ,sizeof l);
memset(r ,-1 ,sizeof r);
cin>> n;
for( int i = 0; i< n; i++){
string a, b;
cin>> a >> b;
if(a != "-") l[i] = stoi(a),has_father[l[i]] =true;
if(b != "-") r[i] = stoi(b),has_father[r[i]] =true;
}
int root = 0;
//根结点root
while(has_father[root]) root++;
dfs(root , 1);
if(max_k == n) cout<<"YES"<<" "<<max_id<<endl;
else cout<<"NO"<<" "<<root<<endl;
}