【算法】折纸问题

左程云算法与数据结构课 https://www.bilibili.com/video/BV13g41157hK?p=2&spm_id_from=pageDriver

题目

请把一段纸条竖着放置,然后从纸条的下边向上方对折一次,压出折痕后展开,此时折痕是凹下去的。如果从纸条下边向上方连续对折两次,压出折痕后展开,此时有三条折痕,从上到下折痕的方向依次是凹、凹、凸。

给定一个输入参数 n,代表纸条从下边向上方连续对折 n 次,请从上到下打印折痕的方向。

例如:n = 1时,打印 down;n = 2 时,打印 down down up。

题解

第一次对折在纸条中间出现了一条凹折痕,记为1凹

第二次对折在1凹的上方出现一条凹折痕(记为2凹),在1凹下方出现了一条凸折痕(记为2凸);

第三次对折在2凹的上方和下方分别出现了一条凹折痕(记为3凹)和一条凸折痕(记为3凸),在2凸的上方和下方分别出现了一条凹折痕(也记为3凹)和一条凸折痕(也记为3凸)。

不满发现,除了第一次对折,往后每次对折都是在上一次对折出现的新折痕的上方和下方分别出现一条凹折痕和一条凸折痕。

如果把1凹作为根节点,能创建下面这么一棵满二叉树:

image-20220123171834698

这棵满二叉树满足性质:整棵树的根节点为凹;每一棵子树的根节点的左孩子为凹,右孩子为凸。

对折了n次,则这棵满二叉树有n层。

对这棵假想的满二叉树作中序遍历,得到的结果即为所求。

public class PaperFolding {
    //从上往下打印所有折痕方向
    public static void printAllFolds(int n) {
        printProcess(1, n, true); //true 根节点为凹
    }
    //递归过程,来到某一个节点,
    //i是节点所在层数,n是一共的层数,down == true代表凹,down == false代表凸
    public static void printProcess(int i, int n, boolean down) {
        if (i > n) { //超过了深度
            return;
        }
        printProcess(i + 1, n, true); //往下递归,凹节点
        System.out.println(down ? "down" : "up"); //打印节点的凹/凸
        printProcess(i + 1, n, false); //往下递归,凸节点
    }
    //test
    public static void main(String[] args) {
        int n = 3;
        printAllFolds(n);
    }
}
posted @   hzyuan  阅读(376)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示