0
点赞
收藏
分享

微信扫一扫

微软经典折痕题

鱼板番茄 2022-02-20 阅读 49

一、题目

取出一张纸,使纸张的正面始终面向自己,向上对折,所得到的第一个折痕标记为凹,反之其余情况的折痕为凸。
设折叠次数为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);
    }
}

举报

相关推荐

0 条评论