- 问题描述
-
It's an easy problem. I will give you a binary tree. You just need to tell me the width of the binary tree.
The width of a binary tree means the maximum number of nodes in a same level.
For example, the width of binary tree above is 3.
- 输入
-
The first line is an integer T, means the number of cases.
Then follow T cases.
For each case, the first line is an integer N, means the number of nodes. (1 <= N <= 10)
Then follow N lines. Each line contains 3 integers P A B; indicate the number of this node and its two children node. If the node doesn’t have left child or right child, then replace it by -1.
You can assume the root is 1.
- 输出
-
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; }
NOJ [1186] Get the Width
最新推荐文章于 2021-11-08 21:06:45 发布