题目来自LeetCode,链接:面试题32 - III. 从上到下打印二叉树 III。具体描述为:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[
[3],
[20,9],
[15,7]
]
这道题其实还是二叉树的层序遍历的变体,跟上一道题还是很类似,不同的现在需要根据层数决定返回列表的元素顺序,还是用固定套路如下:
- 初始化一个队列,将根节点入队
- 只要队列非空就执行下面循环:
- 记录当前队列长度m
- 将m个节点出队,这m个值作为一个链表加入结果链表(如果在奇数层直接按原顺序,在偶数层按反顺序)
- 如果这m个出队节点的左右子节点非空,则加入队列(即为下一层需要遍历的节点)
JAVA版代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new LinkedList<>();
if (root == null) {
return result;
}
int count = 1;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> lst = new LinkedList<>();
for (int i = 0; i < size; ++i) {
TreeNode node = queue.poll();
if (count % 2 == 1) {
lst.add(node.val);
}
else {
lst.add(0, node.val);
}
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
result.add(lst);
++count;
}
return result;
}
}
提交结果如下:
![](https://img-blog.csdnimg.cn/20200521205107200.png)
Python版代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if root is None:
return []
result = []
deque = collections.deque()
deque.append(root)
level = 0
while len(deque) > 0:
size = len(deque)
item = []
for _ in range(size):
node = deque.popleft()
item.append(node.val)
if node.left is not None:
deque.append(node.left)
if node.right is not None:
deque.append(node.right)
if level % 2 == 1:
result.append(item[::-1])
else:
result.append(item)
level += 1
return result
提交结果如下:
![](https://img-blog.csdnimg.cn/20200524213047913.png)