做本题的时候先考虑用层序,但是没有思绪,又转为考虑DFS的解法,pat的很多解法是双重标注的方法,在做题的时候需要认真想明白index和root分别指向的是当前的位置和当前的元素,两者通过元素访问,index通过访问变化。本题是DFS解法,但是和前面的逻辑题本质无差别。
本题的另外一个需要注意的事项是,因为访问元素可能超过10,这时不能再用char来接受了。
DFS解法
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=25;
int maxnum=-1,finalnode;
struct node
{
int lchild,rchild;
}a[maxn];
bool hashtable[maxn]={false};
int charTonum(string x)
{
if(x=="-")
return -1;
else
{
int num=stoi(x);
hashtable[num]=true;
return num;
}
}
void DFS(int root,int index)
{
if(index>maxnum)
{
maxnum=index;
finalnode=root;
}
if(a[root].lchild!=-1)DFS(a[root].lchild,index*2);
if(a[root].rchild!=-1)DFS(a[root].rchild,index*2+1);
}
int main()
{
int n,root;
cin>>n;
for(int i=0;i<n;i++)
{
string c1,c2;
cin>>c1>>c2;
a[i].lchild=charTonum(c1);
a[i].rchild=charTonum(c2);
}
for(int i=0;i<n;i++)
{
if(hashtable[i]==false)
{
root=i;
break;
}
}
DFS(root,1);
if(maxnum>n)
printf("NO %d",root);
else
{
printf("YES %d",finalnode);
}
}