折纸问题

折纸问题

面试题

请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。 如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。
给定一个输入参数N,代表纸条都从下边向上方连续对折N次。 请从上到下打印所有折痕的方向。
例如:N=1时,打印: down N=2时,打印: down down up

折纸演示

这样,从下往上折

image-20210223093803217.png
image-20210223093830087.png

思考

一生二,二生四,这是啥,是不是马上想到二叉树,而且还是满二叉树,把这个图片左旋90°,然后整理整理就是下面的树。

第一次折

①凹

第二次折

image-20210223094451620.png

第三次折

image-20210223094517693.png

题目里把凹折痕说是下折痕(down),凸折痕(up),你可以发现纸条从上到下正好就是这个满二叉树的中序遍历。

那么题解就是输出这个满二叉树的中序遍历,那如何操作呢?需要把树建出来,然后再用树头节点来输出么?由于左孩子节点都是凹折痕,右孩子都是凸折痕,树是满树,也就是说我们不需要知道每个节点的具体结构内存位置啥的。只要知道是左右孩子我就输出down或者up,然后有多少层我就递归多少层就完事了。

代码实现

public class Code08_PaperFolding {
    public static void printPaperFoldingMark(int N){
        ins(N,1,true);
    }

    private static void ins(int n, int floor, boolean down) {
        if(floor>n) return;
        ins(n,floor+1,true);
        System.out.print((down?"down":" up ")+"\t");
        ins(n,floor+1,false);
    }

    public static void main(String[] args) {
        printPaperFoldingMark(3);
    }
}

生活被二叉树包围了兄弟们,^ _^

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定二叉树的根结点root,请返回打印结果,结果按照...
    Crystalajj阅读 4,052评论 0 2
  • 题目一 递归实现先序,中序,后序遍历二叉树: 非递归实现先序,中序,后序遍历二叉树: 按层遍历二叉树: 题目二 解...
    憨憨二师兄阅读 759评论 0 0
  • 一、为什么前端需要学习数据结构与算法? 以前的前端页面都是多页面,现在前端的趋势是单页面应用,需要将复杂的逻辑都放...
    Miss_麦兜阅读 603评论 0 0
  • 折纸问题 一张厚度为1mm的纸,在不考虑其长度的前提下,可以折叠无数次,每折叠一次厚度翻倍,那么对折多少次可以达到...
    FANDX阅读 354评论 0 0
  • 问题描述 : 已知有一张纸,其厚度为1厘米。现在给你一座山的高度N(单位:米)。问将纸对折多少次后,其厚度将超过这...
    澜莲阅读 270评论 0 1