题目来自LeetCode,链接:面试题32 - II. 从上到下打印二叉树 II。具体描述为:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[
[3],
[9,20],
[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;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int count = queue.size();
List<Integer> list = new LinkedList<>();
for (int i = 0; i < count; ++i) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
result.add(list);
}
return result;
}
}
提交结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8c05580891fb98fc801efc8d34be49a0.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 []
queue = collections.deque()
queue.append(root)
result = []
while len(queue) > 0:
size = len(queue)
item = []
for i in range(size):
node = queue.popleft()
item.append(node.val)
if node.left is not None:
queue.append(node.left)
if node.right is not None:
queue.append(node.right)
result.append(item)
return result
提交结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/080963efeb1ff8031d69365e30a39062.png)