ZJU2992 Monkey Vines - 二叉树 推规律

 题目描述:

用方括号表示出一个完全二叉树,要使得任意一个节点的左右两边权重相等,总权重至少要多少?

分析:

最开始想用链表做一颗二叉树,然后对每个节点递归找左右两边的权重,取较大的一边。

写着写着发现不用链表建树也行,递归本身就是一个树形结构。于是直接用递归来表示。写完后发现WA……

郁闷了好半天,猜想是不是总权重等于2^Deepth,结果AC了。

这样一来递归都不用,线性扫描就行

  1. /*
  2. ZJU2992 Monkey Vines
  3. */
  4. #include <stdio.h>
  5. #define MAX(a,b) ((a)>(b)?(a):(b))
  6. char s[155];
  7. int v,maxd,d;
  8. int main()
  9. {
  10.     int T,Tn;
  11.     scanf("%d",&Tn);
  12.     gets(s);
  13.     
  14.     for(T=1;T<=Tn;T++){
  15.         //input
  16.         gets(s);
  17.         
  18.         //work
  19.         if(s[0]==0){
  20.             printf("%d %d/n",T,1);
  21.             continue;
  22.         }
  23.         d=v=1;maxd=1;
  24.         while(s[v]){
  25.             maxd=MAX(maxd,d);
  26.             if(s[v++]=='[') d++;
  27.             else d--;
  28.         }    
  29.         
  30.         printf("%d %d/n",T,1<<maxd);
  31.     }
  32.     return 0;
  33. }

你可能感兴趣的:(ZJU2992 Monkey Vines - 二叉树 推规律)