解题思路:
利用两个栈stack1和stack2,stack1暂存奇数层的节点,stack2暂存偶数层的节点。当stack1中节点即奇数层节点出栈时,存入一个当前层次的arraylist中,与此同时,判断该节点是否有左、右子节点,若有,则在stack2中先压入左子节点,后压入右子节点,这样做是为了满足之字形顺序这个条件。当stack1中所有节点都出栈时,将当前层的arraylist加入到一个存放所有层的arraylist中,然后将层次level加1。当stack2中节点即偶数层节点出栈时,步骤和stack1类似,只是在stack1中先压入右子节点,再压入左子节点。
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 Solution {
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> arrayListAllLevel = new ArrayList<>();
if (pRoot == null) {
return arrayListAllLevel;
}
//stack1暂存奇数层节点
Stack<TreeNode> stack1 = new Stack<>();
//stack2暂存奇数层节点
Stack<TreeNode> stack2 = new Stack<>();
//初始层次为第一层
int level = 1;
//将第1层的节点按从左到右的顺序入栈
stack1.push(pRoot);
while (!stack1.isEmpty() || !stack2.isEmpty()) {
//保存该层中栈的元素
ArrayList<Integer> arrayListlevel = new ArrayList<>();
//判断是哪一个栈进行出栈操作
if (level % 2 == 1) {
//当奇数层执行出栈操作时
//如果stack1还存在元素,则继续出栈
while ( !stack1.isEmpty()) {
TreeNode node = stack1.pop();
//出栈同时加入到奇数层次的数组中
arrayListlevel.add(node.val);
//在出栈的同时,将此节点的左右子节点入stack2
//同时存入另一个栈的顺序是先存左子节点,再存右子节点
if (node.left != null) {
stack2.push(node.left);
}
if (node.right != null) {
stack2.push(node.right);
}
}
level++;
//stack1中所有元素出栈完毕后,将奇数层次的所有元素加入到整个线性表中
arrayListAllLevel.add(arrayListlevel);
} else {
//stack2执行出栈操作
//当偶数层执行出栈操作时
//如果stack2还存在元素,则继续出栈
while ( !stack2.isEmpty()) {
TreeNode node = stack2.pop();
//出栈同时加入到奇数层次的数组中
arrayListlevel.add(node.val);
//在出栈的同时,将此节点的左右子节点入stack1
//同时存入另一个栈的顺序是先存右子节点,再存左子节点
if (node.right != null) {
stack1.push(node.right);
}
if (node.left != null) {
stack1.push(node.left);
}
}
level++;
//stack2中所有元素出栈完毕后,将偶数层次的所有元素加入到整个线性表中
arrayListAllLevel.add(arrayListlevel);
}
}
return arrayListAllLevel;
}
}