一、题目解析
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
该题可以借助两个栈来解决问题,一个栈用来存储奇数层的节点,一个栈用来存储偶数层的节点
注意奇数层时从左到右读取,偶数层是从右到左读取,所以对应的栈存储顺序是对应相反的
二、代码
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
//stack1 用来存储奇数层节点
Stack<TreeNode> stack1 = new Stack<>();
stack1.push(pRoot);
//stack2 用来存储偶数层节点
Stack<TreeNode> stack2 = new Stack<>();
//用来记录层数
int layer = 1;
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
//当两个栈均非空时,出栈入栈
while (!stack1.empty() || !stack2.empty()) {
ArrayList<Integer> list = new ArrayList<>();
//奇数层节点,将下一层节点存储到 stack2 中
if (layer % 2 != 0) {
while (!stack1.empty()) {
TreeNode pop = stack1.pop();
if (pop != null) {
list.add(pop.val);
stack2.push(pop.left);
stack2.push(pop.right);
}
}
} else {
//偶数层节点,将下一层节点存储到 stack1 中
while (!stack2.empty()) {
TreeNode pop = stack2.pop();
if (pop != null) {
list.add(pop.val);
stack1.push(pop.right);
stack1.push(pop.left);
}
}
}
if (!list.isEmpty()) {
lists.add(list);
layer++;
}
}
return lists;
}
三、总结
本题关键就是利用栈先进后出的特性