题目:给一个很长很窄的纸条,把纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开,此时折痕是凹下去的,也就是突起的方向指向纸条的下方;
如果从纸条的下边向上方对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是:下折痕、下折痕、上折痕;
如果纸条每次都从下边向上方对折,在对折n次之后展开。此时所有折痕突起的方向是什么样的呢?
请写一个函数,输入一个整数代表纸条的对折次数记为fTimes,从上到下依次打印所有折痕的突起方向。
例如:
fTimes = 1
打印:down
fTimes = 2
打印:down down up
如果从纸条的下边向上方对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是:下折痕、下折痕、上折痕;
如果纸条每次都从下边向上方对折,在对折n次之后展开。此时所有折痕突起的方向是什么样的呢?
请写一个函数,输入一个整数代表纸条的对折次数记为fTimes,从上到下依次打印所有折痕的突起方向。
例如:
fTimes = 1
打印:down
fTimes = 2
打印:down down up
思路:折痕其实是二叉树结构。该二叉树的特点是:根节点是下,每一个节点的左节点是下,右节点是上。该二叉树的中序遍历即为答案,但不需要构造一颗二叉树,用递归方法可打印出来。
java实现
public void printAllFlods(int fTimes) {
if(fTimes<1)
return;
printProcess(1,fTimes,true);
}
public void printProcess(int index,int n,boolean isDown) {
if(index==n) {
System.out.println(isDown?"down":"up");
return;
}
printProcess(index+1,n,true);
System.out.println(isDown?"down":"up");
printProcess(index+1,n,false);
}
下面的解法是将结果存在数组里,不是打印出来
public String[] saveAllFlods(int fTimes) {
if(fTimes<1)
return null;
List<String> list=new LinkedList<String>();
saveProcess(1,fTimes,true,list);
int len=(2<<fTimes-1)-1;
String[] results=new String[len];
for(int i=0;i<len;i++) {
results[i]=list.get(i);
}
return results;
}
public void saveProcess(int index,int n,boolean isDown,List<String> list) {
if(index>n) {
return;
}
saveProcess(index+1,n,true,list);
list.add(isDown?"down":"up");
saveProcess(index+1,n,false,list);
}