微软经典折痕题

该博客介绍了通过折叠纸张形成的一种特殊序列,该序列与满二叉树的中序遍历相对应。当按照特定方式折叠纸张N次后,折痕的凹凸顺序可以通过二叉树的中序遍历来确定。作者提供了代码实现,用于打印出N次折叠后的折痕顺序,展示了递归在解决此类问题中的应用。
摘要由CSDN通过智能技术生成

一、题目

取出一张纸,使纸张的正面始终面向自己,向上对折,所得到的第一个折痕标记为凹,反之其余情况的折痕为凸。
设折叠次数为N次,求折叠N次之后,由上往下折痕的顺序。

样例:
N=1
折痕顺序为

N=2
折痕顺序为
凹凹凸

二、题解

(1)原理

第一次折叠之后,得到的折痕标记为1凹,折叠第二次之后,观察发现,在1凹的上方与下方分别得到两个新的折痕,其中上方标记为2凹,下方标记为2凸,折叠第三次之后,观察发现,在2凹与2凸的上方与下方分别出现两个新的折痕,分别标记为3凹,3凸,3凹,3凸。
由上述规律总结之后得出,可以将折痕的凹凸记录为:根节点为凹,左子树的根节点为凹,右子树的根节点为凸的一个满二叉树。从上往下所得到的折痕的凹凸顺序为该满二叉树的中序遍历的结果。
如图:
在这里插入图片描述

(2)代码
public class PaperFolding {
    // 微软折痕题(凹凸)
    public static void printAllFolds(int N) {
        printProcess(1, N, true);
    }

    // 递归过程,来到了某一个结点
    // i是结点的层数,N是一共的层数,down == true 表示凹  down == true 表示凸
    public static void printProcess(int i, int N, boolean down){
        if (i > N) {
            return;
        }
        printProcess(i+1, N,true);
        System.out.println(down ? "凹" : "凸");
        printProcess(i+1, N, false);
    }
    public static void main(String[] args) {
        int N = 3;
        printAllFolds(N);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值