一张纸折叠N次,请从上到下打印所有的:凹凸折痕

本文解析了一张纸连续折叠N次时的凹凸折痕规律,通过二叉树中序遍历的概念,演示如何模拟打印过程。重点在于理解递归和中序遍历在模拟折痕中的应用,适合面试时展示对数据结构的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一张纸折叠N次,请从上到下打印所有的:凹凸折痕

提示:二叉树中序遍历的经典应用,也是曾经左神见过的Facebook的考试题


题目

你亲手拿纸张准备干:

一张纸,折叠1次,你可以看见中间,有一个向下的凹的折痕。
在这里插入图片描述
从上到下打印折痕:凹(N=1)

连续折叠2次呢?你可以看见,在第一次凹折痕的上和下,分别新增一个凹折痕与凸折痕。
在这里插入图片描述
从上到下打印折痕:凹(2) 凹(1) 凸(2)
连续折叠3次呢?你可以看见,再第二次新增那俩凹凸折痕的各自上下,都会有新增一个凹,一个凸折痕。
自己拿纸张折叠你就知道了
在这里插入图片描述
从上到下打印折痕:凹(3) 凹(2)凸(3) 凹(1) 凹(3)凸(2)凸(3)

那么,一张纸折叠N次,请你从上到下打印所有的:凹凸折痕


二、解题

其实自己拿纸折叠一比,就知道
第N次折叠,出来的折痕
是在N-1次那俩新出的折痕的上下分别新增凹凸
与1–N-2次折叠的痕迹没关系

这个折痕完全和二叉树对上了【如果把节点x的左子,叫上边折痕,x的右子叫下边折痕】
N=1
在这里插入图片描述
N=2
在这里插入图片描述
N=3
在这里插入图片描述
发下了没,N递增过程中,沿着N-1层的节点,左右各自新增一个凹凸

中序遍历就是折叠痕迹:从上到下打印折痕:凹(3) 凹(2)凸(3) 凹(1) 凹(3)凸(2)凸(3)
咱不用先生成树,直接中序遍历模拟打印:

//N递增过程中,沿着N-1层的节点,左右各自新增一个凹凸
    public static void foldedPaperPrint(int N){
        //递归
        if (N == 0) return;

        System.out.println("N=" + N);
        foldPrint(1, N, true);
        //来到level=1层,最大N层,要打印的flagAo:是凹吗,第一次折叠为凹
    }
    //递归中序遍历打:来到level层,最大N层,要打印的flagAo:是凹还是凸,凹true,凸false
    public static void foldPrint(int level, int N, boolean flagAo){
        if (level > N) return;//多了不行

        //模拟中序遍历打印--左头右
        foldPrint(level + 1, N, true);//左打印凹
        System.out.println(flagAo ? "凹" : "凸");//是打印凹吗?头打印
        foldPrint(level + 1, N, false);//右打印凸
    }
    public static void test2(){
        foldedPaperPrint(0);
        foldedPaperPrint(1);
        System.out.println("---------");
        foldedPaperPrint(2);
        System.out.println("---------");
        foldedPaperPrint(3);
    }


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

结果自然明了:

N=1---------
N=2
凹
凹
凸
---------
N=3
凹
凹
凸
凹
凹
凸
凸


总结

提示:重要经验:

1)本题打印折叠痕迹,是经典的二叉树的应用,第一次见我就敏感地想到了
2)中序遍历模拟实现打印,不需要提前建树哦!
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值