写在前面:
首先,我们需要知道,按之字形顺序打印的规律,即:
(1)第一行,也就是根节点,按从左至右打印-----奇数行
(2)第二行,也就是根节点的左子树,右子树,按从右至左打印-----偶数行
依次类推,这样我们就找到了规律,我们定义一个int layer记录层数,定义两个栈 Stack1 记录奇数行的结点,Stack2 记录偶数行的结点。
代码实现:
public ArrayList<ArrayList<Integer>> Print(TreeNode root) {
int layer = 1;// 记录层数,奇数层从左至右打印,偶数层,从右至左打印
Stack<TreeNode> stack1 = new Stack<TreeNode>();
stack1.push(root);
Stack<TreeNode> stack2 = new Stack<TreeNode>();
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
while (!stack1.empty() || !stack2.empty()) {
if (layer % 2 != 0) {
ArrayList<Integer> temp = new ArrayList<Integer>();
// 奇数层
while (!stack1.empty()) {
TreeNode node = stack1.pop();
if (node != null) {
temp.add(node.val);
System.out.println(node.val + " ");
stack2.push(node.left);
stack2.push(node.right);
}
}
if (!temp.isEmpty()) {
list.add(temp);
layer++;
}
} else {
// 偶数层
ArrayList<Integer> temp = new ArrayList<Integer>();
while (!stack2.empty()) {
TreeNode node = stack2.pop();
if (node != null) {
temp.add(node.val);
System.out.println(node.val + " ");
stack1.push(node.right);
stack1.push(node.left);
}
}
if (!temp.isEmpty()) {
list.add(temp);
layer++;
}
}
}
return list;
}