题目地址:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/
按题目的要求,需要我们偶数行按照从左到右的顺序打印,奇数行按照从右到左的顺序打印。
对于这样的需要按照一定的顺序打印结果的时候,可以使用LinkedList作为一个双端的队列
层次打印二叉树我们本来就习惯于从左到右打印。
所以:
从左到右打印: 把我们的数据从双端队列的首部依次插入,确保输出后顺序不变
从右到左打印: 把我们的数据从双端队列的尾部依次插入,确保输出后的结果倒序
在原先层序遍历的基础上做修改即可
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//从上到下,0.2.4.6...从左到右1.3.5.7...从右到左
int num = 0;
List<List<Integer>> listTree = new ArrayList<>();
if(root == null) return listTree;
//使用双端队列的特性去存储我们遍历的数据 奇数层添加到尾部,偶数层添加到首部
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
//作为一个双端的队列
LinkedList<Integer> list = new LinkedList<>();
for(int i = queue.size() - 1; i >= 0; i--){
//把节点从队列中推出
TreeNode node = queue.poll();
//如果是偶数 从左到右
if(num % 2 == 0){
//添加到list的尾部,即双端队列的头部
list.addLast(node.val);
}else{//如果是奇数 从右到左
//...双端队列的尾部
list.addFirst(node.val);
}
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
listTree.add(list);
num++;
}
return listTree;
}
}