欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

折纸问题

程序员文章站 2024-01-15 12:49:52
...

折纸问题

题目

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

解析

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

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

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

public class PaperFloding {

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

    private 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的测试结果
折纸问题

相关标签: BinaryTree