这道题目的叙述有一点不清楚,这里的宽度指的是最大的单层结点个数。
下面是c代码
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
const int MAX_N = 21;
int N;
int l[MAX_N];
int r[MAX_N];
int wide[MAX_N];
int answide;
int ansheight;
int init()
{
scanf("%d",&N);
int i;
for (i=1;i<=N;i++)
scanf("%d %d",&l[i],&r[i]);
}
int work(int t,int deep)
{
if (l[t]>0)
{
work(l[t],deep+1);
wide[deep]++;
}
if (r[t]>0)
{
work(r[t],deep+1);
wide[deep]++;
}
if (deep>ansheight) ansheight=deep;
if (wide[deep]>answide) answide=wide[deep];
}
int put()
{
if (N==1) answide=ansheight=1;
printf("%d %d",answide,ansheight);
}
int main()
{
init();
work(1,1);
put();
return 0;
}
下面是Pascal代码:
program eee;
var n,i,maxw,maxd:longint;
lc,rc:array[1..10000]of longint;
wid:array[1..10000]of longint;
procedure go(dep,i:integer);
begin
if lc[i]>0 then
begin
inc(wid[dep]);
go(dep+1,lc[i]);
end;
if rc[i]>0 then
begin
inc(wid[dep]);
go(dep+1,rc[i]);
end;
if dep>maxd then maxd:=dep;
end;
begin
readln(n);if n=1 then begin writeln(1,' ',1);exit;end;
for i:=1to n do readln(lc[i],rc[i]);
go(1,1);
maxw:=wid[1];
wid[1]:=1;
for i:=2to n do if wid[i]>maxw then maxw:=wid[i];
writeln(maxw,' ',maxd);
end.