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. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值