题目描述:
用方括号表示出一个完全二叉树,要使得任意一个节点的左右两边权重相等,总权重至少要多少?
分析:
最开始想用链表做一颗二叉树,然后对每个节点递归找左右两边的权重,取较大的一边。
写着写着发现不用链表建树也行,递归本身就是一个树形结构。于是直接用递归来表示。写完后发现WA……
郁闷了好半天,猜想是不是总权重等于2^Deepth,结果AC了。
这样一来递归都不用,线性扫描就行
- /*
- ZJU2992 Monkey Vines
- */
- #include <stdio.h>
- #define MAX(a,b) ((a)>(b)?(a):(b))
- char s[155];
- int v,maxd,d;
- int main()
- {
- int T,Tn;
- scanf("%d",&Tn);
- gets(s);
- for(T=1;T<=Tn;T++){
- //input
- gets(s);
- //work
- if(s[0]==0){
- printf("%d %d/n",T,1);
- continue;
- }
- d=v=1;maxd=1;
- while(s[v]){
- maxd=MAX(maxd,d);
- if(s[v++]=='[') d++;
- else d--;
- }
- printf("%d %d/n",T,1<<maxd);
- }
- return 0;
- }