美文网首页
二叉树之瓶盖换酒

二叉树之瓶盖换酒

作者: Tony简 | 来源:发表于2017-08-15 20:44 被阅读51次

瓶盖换酒问题

二叉树问题无处不在,在微信群里面遇到这样有趣的问题:2元钱可以买一瓶瓶酒,一瓶啤酒喝完可以得到1个空瓶和1个瓶盖,4个瓶盖能换一瓶酒,2个空瓶可换一瓶酒,那么问题来了,10元最多可以喝到几瓶瓶酒?

换酒问题

看似简单的问题,你的答案又是多少呢?

接下来我们来分析一下这个问题:

首先,10元不管你怎么换,什么时候换,都是得到最原始的5瓶酒,也就5个空瓶(A)和5个瓶盖(B),即5A5B;

其次,我们简化下交换过程,2个空瓶换一瓶酒也就是得到1空瓶和1瓶盖,本质上就是-1A和+1B操作(简称向左走);4个瓶盖换一瓶酒本质上就是+1A和-3B操作(向右走)。

然后,我们看到,每次换酒无非就是向左走向右走的选择,而且都能多喝了一瓶酒,也就是说,交换次数越多次,喝到的酒越多。

遍历二叉树:

要知道最多能喝多少瓶酒,实际上只要求出最大的交换次数,这个可以通过遍历二叉树取得,这里我们使用先序遍历。

这里我们用java实现算法,新建一个类BinTreeTraverse和内部类Node子节点,根据二叉树的结构每个父节点都保留左右两个子节点,还有交换次数,空瓶子数和瓶盖数,track是交换记录,A表示2个空瓶换一瓶,B表示4个瓶盖换一瓶酒;

子节点

然后我们要进行的是生成这个二叉树关系,通过判断左右节点是否存在,然后递归调用就可以生成关系二叉树,每次生成节点都把最大交换次数和最大交换次数存起来。

二叉树关系生成

最后执行完成我们打印记录的maxNode的最大值和track:

maxTime = 10;

track = AAAABABABA;

我们可以知道,最多可以交换10次,加上原来的5瓶酒,最多可以喝到15瓶酒。

其实我们在creatTree()函数中打印出所有交换次数等于10的结果,你会发现其实又156种喝到15瓶酒的方法。

相关文章

  • 二叉树之瓶盖换酒

    瓶盖换酒问题 二叉树问题无处不在,在微信群里面遇到这样有趣的问题:2元钱可以买一瓶瓶酒,一瓶啤酒喝完可以得到1个空...

  • Swift - 如果一瓶酒2元,4个瓶盖换一瓶,2个空瓶换一瓶,

    题目:如果一瓶酒2元,4个瓶盖换一瓶,2个空瓶换一瓶,10元可喝几瓶? 分析: 1 设置常数 这里常数用一个结构来...

  • 防止老酒跑酒的5个方法!

    1.先检查您的藏酒,把瓶盖重新再拧紧一下。许多酒出厂时瓶盖本身就是松动的,那数年后“跑酒”的后果该是可想而知了! ...

  • 如何有效地防止白酒跑酒?有这5个办法!

    1、先检查您的藏酒,把瓶盖重新再拧紧一下。许多酒出厂时瓶盖本身就是松动的,那数年后“跑酒”的后果该是可想而知了!这...

  • 不喝酒也要知道并收藏的,一定是这款酒!

    1986年底到1996年之间,茅台酒厂为了防止漏酒,将塑料瓶盖更换成铝制瓶盖。金属质感的瓶盖使茅台包装更显美观、高...

  • 瓶盖换水问题

    问题 矿泉水 2 块钱 1 瓶, 4 个瓶盖或 2 个空瓶可以换 1 瓶矿泉水( 瓶盖跟空瓶要单独计算, 即 2瓶...

  • 换酒

    昨夜窗外大风吹, 屋里老葱把墨堆。 画毕天明送将去, 傍晚换得酒肉归。

  • 换酒

    画就溪山来换酒, 墨成垂瀑去赢酬。 丹青尽染群山秀, 写意抒云荫五洲。 落笔风雷驰卷首, 挥毫早试状元楼。 今朝宴...

  • 换酒

    一日,在微信圈里发一则算数题,引来众多朋友围观。 答案很快就给出来了,十瓶,十五瓶,十七瓶,二十三瓶,...

  • 葡萄酒用软木塞封,还是金属瓶盖??

    葡萄酒用软木塞封的好,还是金属瓶盖的好? 现在酒瓶的封口形式多种多样,使用金属瓶盖的葡萄酒一般而言都非常便宜的,好...

网友评论

      本文标题:二叉树之瓶盖换酒

      本文链接:https://www.haomeiwen.com/subject/ubbvrxtx.html