算法思路:
1.将每个点的值存入固定的数组下标(指的是x的左孩子对对应2x,右孩子对应于2x+1),对应的数组变量(相当于座位)中。
2.看最后一个节点的座位编号是不是等于n(n是总的节点个数),如果是,则是完全二叉树,否则不是。
解题代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=25;
int l[N],r[N];
int a[N];//座位
bool has_father[N];
int last,ans,ans2;
void dfs(int u,int x)
{
if (u==-1) return;
a[x]=u;
if(x>last)
{
last=x;
ans=u;
ans2=x;
}
dfs(l[u],x*2);
dfs(r[u],x*2+1);
}
int main()
{
int n;
cin>>n;
memset(l,-1,sizeof l);
memset(r,-1,sizeof r);//忘记这里会导致段错误
for(int i=0;i<n;i++)
{
//char a,b;第一个错误:不能这样写,因为输入不一定就是个位数
string a,b;
cin>>a>>b;
if(a!="-") {l[i]=stoi(a),has_father[l[i]]=true;}//第二个错误:把这里写成has_father[l[i]]=i;
if(b!="-") {r[i]=stoi(b),has_father[r[i]]=true;}
}
int root=0;
while(has_father[root]==true) root++;
dfs(root,1);
if(last==n){
cout<<"YES"<<" "<<ans<<endl;
}else
{
cout<<"NO"<<" "<<root<<endl;
}
}