![java編程-蛇形打印](http://p2.ttnews.xyz/loading.gif)
蛇形打印:將一個樹型結構按照層級首尾相接地打印。例如將
8
6 10
5 7 9 11
打印為
8
10 6
5 7 9 11
即將偶數層逆序
直接上代碼:
public class SnakePrint {
public static void main(String[] args) {
Queue<btreenode> nodes = new LinkedBlockingQueue<btreenode>();/<btreenode>/<btreenode>
Stack<btreenode> stack = new Stack<btreenode>();/<btreenode>/<btreenode>
nodes.add(root);
nodes.add(xx);
// true:順序打印,false:逆序
boolean flag = true;
while (!nodes.isEmpty()) {
BtreeNode n = nodes.poll();
if (n == xx) {
while (!flag && !stack.isEmpty()) {
System.out.print(stack.pop().val + " ");
}
if (!nodes.isEmpty()) {
System.out.println();
nodes.add(xx);
flag = !flag;
}
} else {
if (flag) {
System.out.print(n.val + " "); // flag為true直接順序打印
} else {
stack.push(n);// flag為false的入棧待遇到換行標誌再出棧打印
}
if (null != n.left) { // 左孩子入棧
nodes.add(n.left);
}
if (null != n.right) { // 右孩子入棧
nodes.add(n.right);
}
}
}
}
/** 分層標記 */
private static BtreeNode xx = new BtreeNode(Integer.MAX_VALUE);
/** 樹根 */
private static BtreeNode root;
static {
BtreeNode t01, t02, t11, t12;
t01 = new BtreeNode(5);
t02 = new BtreeNode(7);
t11 = new BtreeNode(6);
t11.left = t01;
t11.right = t02;
t01 = new BtreeNode(9);
t02 = new BtreeNode(11);
t12 = new BtreeNode(10);
t12.left = t01;
t12.right = t02;
root = new BtreeNode(8);
root.left = t11;
root.right = t12;
}
static class BtreeNode {
BtreeNode left;
BtreeNode right;
int val;
public BtreeNode(int val) {
this.val = val;
}
@Override
public String toString() {
return super.toString() + "_" + val;
}
}
}
如有更好的實現請回復交流。
閱讀更多 道法自然理在悟心 的文章