折纸问题

折纸问题

题目

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

N = 1时,打印 :  down
N = 2时,打印 :  down down up

解析

可以用一张纸条自己折一下,会发现:

  • 第一次折的时候,只有一条折痕,往里凸的,记为1down
  • 第二次折的时候,发现1down的上方为往里凸,记为2down,而下方为往外凸,记为2up
  • 第三次折的时候,发现2dowm的上方往里凸,记为3down2down的下方往外凸,记为3up; 而2up的上方往里凸,记为3down2up的下方往外凸,记为3up

从上面折痕可以发现新的折痕的上面总是为down,下面总是为up,所以我们可以构造出一颗二叉树,具体看下图
在这里插入图片描述
所以当前结点左子树总是down(true),右子树为up(false),所以我们只要按照中序遍历这颗二叉树就解决问题了。

public class PaperFloding {

    //打印的所有折痕方向的函数
    static void printAllFolds(int N){
        printProcess(1,N,true);// 根节点的是down(第一次折的时候是往下的(往里凸))
    }

    static void printProcess(int i, int N, boolean down) {
        if(i > N){ //终止条件(相当于结点为null)
            return;
        }
        printProcess(i+1, N, true);// 相当于往左子树跑(因为左子树永远是down(下))
        System.out.println(down ? "down " : "up ");  //访问中间
        printProcess(i+1, N, false); //往右子树跑
    }


    public static void main(String[] args) {
        int N = 3;
        printAllFolds(N);
    }
}

n = 3的测试结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值