题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
package Proxy;
import java.util.ArrayList;
import java.util.Stack;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Q21_按之字形顺序打印二叉树 {
class Solution {
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
if (pRoot == null) {
return new ArrayList<ArrayList<Integer>>();
}
// 用两个栈分别存放奇数行的节点和偶数行的节点
Stack<TreeNode> stack1 = new Stack<TreeNode>(); // 奇数行(出栈的顺序对应本行节点的从左到右)
Stack<TreeNode> stack2 = new Stack<TreeNode>(); // 偶数行(出栈的顺序对应本行节点的从右到左)
// 结果列表
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
// 首先先将pRoot节点入stack1
stack1.push(pRoot);
while (stack1.isEmpty() || stack2.isEmpty()) {
// 如果两个栈同时都为空,则结束
if (stack1.isEmpty() && stack2.isEmpty()) {
break;
}
// 如果stack1不空,stack2空
if (!stack1.isEmpty()) {
// stack1全部出栈
ArrayList<Integer> hang = new ArrayList<Integer>();
while (!stack1.isEmpty()) {
TreeNode curNode = stack1.pop();
hang.add(curNode.val);
if (curNode.left != null) {
stack2.push(curNode.left);
}
if (curNode.right != null) {
stack2.push(curNode.right);
}
}
result.add(hang);
}
// 如果stack2不空,stack1空
if (!stack2.isEmpty()) {
// stack2全部出栈
ArrayList<Integer> hang = new ArrayList<Integer>();
while (!stack2.isEmpty()) {
TreeNode curNode = stack2.pop();
hang.add(curNode.val);
if (curNode.right != null) {
stack1.push(curNode.right);
}
if (curNode.left != null) {
stack1.push(curNode.left);
}
}
result.add(hang);
}
}
// 处理完毕,返回
return result;
}
}
}