问题:对折纸,永远从同一个方向对折,输出对折N次后每个折痕的朝向。
算法:
package io.guangsoft;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
public class FoldAlgorithm {
//节点类
private static class Node<T> {
public T item;
public Node left;
public Node right;
public Node(T item, Node left, Node right) {
this.item = item;
this.left = left;
this.right = right;
}
}
//模拟对折N次纸,产生树
public static Node<String> createNode(int n) {
//定义根节点
Node<String> root = null;
for(int i = 0; i < n; i++) {
//如果为第一次对折,创建根节点
if(i == 0) {
root = new Node("down", null, null);
continue;
}
//定义一个辅助队列,通过层序遍历思想,找到叶子节点,叶子结点添加叶子结点
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
//循环遍历队列
while(!queue.isEmpty()) {
//从队列弹出一个节点
Node tmp = queue.poll();
//如果有左子节点,则把左子节点放入队列
if(tmp.left != null) {
queue.offer(tmp.left);
}
//如果有右子节点,则把右子节点放入队列
if(tmp.right != null) {
queue.offer(tmp.right);
}
//如果同时没有左子节点和右子节点,那么该节点为叶子结点,只需要给该节点添加左子节点和右子节点即可
if(tmp.left == null && tmp.right == null) {
tmp.left = new Node("down", null, null);
tmp.right = new Node("up", null, null);
}
}
}
return root;
}
//中序遍历树
public static void printTree(Node<String> root) {
if(root == null) return;
//打印左子树的每个节点
if(root.left != null) {
printTree(root.left);
}
//输出当前节点
System.out.printf("%4s\t", root.item );
//打印当前节点
if(root.right != null) {
printTree(root.right);
}
}
//主类
public static void main(String args[]) {
printTree(createNode(3));
}
}
结果: