题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二行是从右到左的顺序打印,第三行再按照从左到右的顺序打印,依次类推。
示例
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回结果:
[
[3],
[20,9],
[15,7]
]
解题思路
对于二叉树的奇数层,第1,3,5…层,从左到右遍历,对于偶数层从右到左遍历。
维护一个列表,根据结果集中的size()判断当前是奇数层还是偶数层。
因为初始结果集中的大小是0,第一层是奇数层,可以推出。
size()=0,第一层 奇数层
size()=1,第二层 偶数层
size()=2,第三层 奇数层
…
所以 result.size()%2==1
代表当前遍历的是偶数层需要翻转临时列表。
编码实现
public List<List<Integer>> levelOrder(TreeNode root) {
//双端队列保存树中每一层的节点
Deque<TreeNode> dequeue = new LinkedList<TreeNode>();
//定义结果集
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root!=null) dequeue.add(root);
while(!dequeue.isEmpty()){
LinkedList<Integer> temp = new LinkedList<Integer>();
for (int i = 0; i < dequeue.size(); i++) {
TreeNode node = dequeue.poll();
//从队列中取出节点,将节点中的数据添加到临时list中
temp.add(node.val);
if (node.left!=null){
dequeue.add(node.left);
}
if (node.right!=null){
dequeue.add(node.right);
}
}
//如果是奇数层需要翻转这层的节点
if (result.size()%2==1) {
Collections.reverse(temp);
}
result.add(temp);
}
return result;
}