蛇形打印二叉树
即第一行从左到右的顺序打印,第二行从右到左的顺序打印,第三行又是从做到右的顺序打印…
如图所示:
思路:
使用两个栈。一个栈存储奇数层节点,另一个栈存储偶数层节点。
若是奇数层,则打印顺序是从左往右,即先添加左子树,再添加右子树,即先保存左子节点,再保存右子节点。
若是偶数层,打印顺序是从右向左,先添加右子树,再添加左子树。 因为栈是先进后出,所以需要注意左右子树入栈的顺序。
class Node {
char value; //数据域
Node left; //左孩子节点
Node right; //右孩子节点
//}
public Node(char value) {
this.value = value;
}
}
public ArrayList<ArrayList<Character>> zigzagOrder(Node root) {
int level = 1;
Stack<Node> stack1 = new Stack<>(); //栈1存奇数节点
stack1.push(root); //将根节点入栈
Stack<Node> stack2 = new Stack<>(); //栈2存偶数节点
ArrayList<ArrayList<Character>> list = new ArrayList<>();
while (!stack1.empty() || !stack2.empty()) {
if (level % 2 != 0) { //奇数层,该层为奇数层,叶子节点从右向左入栈,所以该层的叶子节点应入偶数栈
ArrayList<Character> t = new ArrayList<>();
while (!stack1.empty()) {
Node cur = stack1.pop();
if (cur != null) {
t.add(cur.value);
stack2.push(cur.left);
stack2.push(cur.right);
}
}
if (!t.isEmpty()) {
list.add(t);
level++;
}
} else {
ArrayList<Character> t = new ArrayList<>();
while (!stack2.empty()) {
Node cur = stack2.pop();
if (cur != null) {
t.add(cur.value);
stack1.push(cur.right);
stack1.push(cur.left);
}
}
if (!t.isEmpty()) {
list.add(t);
level++;
}
}
}
return list;
}