题目
之字形打印二叉树:第一行从左到右,第二行从右到左
分析
如图所示,在打印某一层的节点时,需要把下一层的子节点保存到栈中。
步骤 | 层数 | 操作(还需加上奇偶层的操作) | stack1的节点(保存当前打印节点的子节点,先左后右。触发条件:当前节点为奇数层) | stack2的节点(先右后左。触发:当前节点为偶数层) |
1 | 1 | 打印节点1 | 2,3 | |
2 | 2 | 打印3 (stack1不为空,打印stack1栈顶) | 2 | 7,6 |
3 | 2 | 打印2(直到把stack1打印完) | 7,6,5,4 | |
4 | 3 | 打印4( stack1为空,开始打印stack2) | 8,9 | 7,6,5 |
5 | 3 | 打印5 | 8,9,10,11 | 7,6 |
6 | 3 | 打印6 | 8,9,10,11,12,13 | 7 |
7 | 3 | 打印7 | 8,9,10,11,12,13,14,15 |
解题思路
1、定义两个栈,当前层为奇数层时,将当前存入输出数组的节点的子节点按照从左到右保存到s2中;偶数层数时,将当前存入输出数组的节点的子节点按照从右到左保存到s1中。
2、将每一层的节点全部存入栈中,奇数层存在s1中,偶数层存在s2中
参考答案
import java.util.ArrayList;
import java.util.Stack;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
int layer = 1;
//s1存奇数层节点
Stack<TreeNode> s1 = new Stack<TreeNode>();
s1.push(pRoot);
//s2存偶数层节点
Stack<TreeNode> s2 = new Stack<TreeNode>();
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
while (!s1.empty() || !s2.empty()) {
if (layer%2 != 0) {
ArrayList<Integer> temp = new ArrayList<Integer>();
while (!s1.empty()) {
TreeNode node = s1.pop();
if(node != null) {
temp.add(node.val);
System.out.print(node.val + " ");
s2.push(node.left);
s2.push(node.right);
}
}
if (!temp.isEmpty()) {
list.add(temp);
layer++;
System.out.println();
}
} else {
ArrayList<Integer> temp = new ArrayList<Integer>();
while (!s2.empty()) {
TreeNode node = s2.pop();
if(node != null) {
temp.add(node.val);
System.out.print(node.val + " ");
s1.push(node.right);
s1.push(node.left);
}
}
if (!temp.isEmpty()) {
list.add(temp);
layer++;
System.out.println();
}
}
}
return list;
}
}