For each case, output the width.
其实,方法很多,这里我用的是搜索
//一个结构体来存点,成员有当前rank,左二子,右儿子
//输入完以后,sort排序,从根节点开始,依次去存好每个节点的等级,
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node
{
int left,right;
}node[25];
int rank[25];
bool lp[25],rp[25];
int lay,alllay;
void search_rank(int p)
{
if(node[p].left!=-1 && lp[p]) //有左儿子
{
rank[lay]++;
int l=node[p].left;
lp[p]=false;
lay++;
alllay++;
//printf("递归%d的左子树节点%d ,当前第%d层有节点%d个\n",p,l,lay-1,rank[lay-1]);
search_rank(l);
}
if(node[p].right!=-1 && rp[p])
{
rank[lay]++;
int r=node[p].right;
rp[p]=false;
lay++;
alllay++;
//printf("递归%d的右子树节点%d ,当前第%d层有节点%d个\n",p,r,lay-1,rank[lay-1]);
search_rank(r);
}
lay--;
return ;
}
int cmp(const int a,const int b)
{
return a>b;
}
int main()
{
int T,n,i,j;
int p,pl,pr;
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%d",&n);
memset(rank,0,sizeof(rank));
memset(lp,true,sizeof(lp));
memset(rp,true,sizeof(rp));
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&p,&pl,&pr);
node[p].left=pl;
node[p].right=pr;
}
rank[1]=1;
alllay=1;
lay=2;
search_rank(1);
sort(rank+1,rank+alllay+1,cmp);
printf("%d\n",rank[1]);
}
}
return 0;
}