题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
- 之前我们写过按层次打印二叉树,我们只需要在原来的基础上进行改进,就可以实现本题的要求,之前我们是把每层的数据存进ArrayList中,现在我们可以只需要稍加改进,在偶数层时对ArrayList进行reverse操作.
- 但是在海量数据时,reverse效率是非常低的,那我们思考,怎么来避免reverse操作了,对了,可以使用双向链表!!!
- 我们把ArrayList换做双向链表,也就是LinkedList,这样我们只需要在奇数层从前往后遍历,偶数层从后往前遍历,就实现了本题的要求
- 实现层次遍历是使用队列的来实现的,我之前写过了,不清楚了的可以参考博客 : 按照层次从上往下打印二叉树
本题代码如下:
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
if (pRoot == null) {
return ret;
}
ArrayList<Integer> list = new ArrayList<>();
LinkedList<TreeNode> queue = new LinkedList<>();
queue.addLast(null);//层分隔符
queue.addLast(pRoot);
boolean leftToRight = true;
while (queue.size() != 1) {
TreeNode node = queue.removeFirst();
if (node == null) {//到达层分隔符
Iterator<TreeNode> iter = null;
if (leftToRight) {
iter = queue.iterator();//从前往后遍历
} else {
iter = queue.descendingIterator();//从后往前遍历
}
leftToRight = !leftToRight;
while (iter.hasNext()) {
TreeNode temp = (TreeNode)iter.next();
list.add(temp.val);
}
ret.add(new ArrayList<Integer>(list));
list.clear();
queue.addLast(null);//添加层分隔符
continue;//一定要continue
}
if (node.left != null) {
queue.addLast(node.left);
}
if (node.right != null) {
queue.addLast(node.right);
}
}
return ret;
}
}