题目
把一张纸条,对折一次打开,会发现中间有一道“凹”痕,合上纸条再次对折一次打开,会发现在第一次对折的凹痕的上下两侧,出现了一道“凹”痕和一道“凸”痕。
继续对折,仍然是这样的规律。
问,输入对折次数N,打印出从上到下,所有痕迹的“凹”“凸”状态。
分析
我们发现痕迹会在原先痕迹的上下出现,这与二叉树十分的契合。
但是如果我们去构建一个N层的二叉树,然后再中序遍历成序列输出。占用的空间会很大。
这里分享了一个最省空间的办法。
使用递归的方式代替树,每一次只占用一条树的链条的空间。递归的时候先进入“凹”的条件,想当于先进入左树,并且在左树打印“凹”,超出预设的N的时候返回,不进入下一层。
很好的实现了树的思想,但是又没有占用树那么大的空间。
代码
public static void printAllFolds(int N) {
printProcess(1, N, true);
}
//模拟了一棵二叉树,但是只使用了O(N)的空间
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 = 4;
printAllFolds(N);
}