小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
也就是把这样一个二叉树:
3
/ \
9 20
/ \
15 7
转变成这样:
[
[3],
[9,20],
[15,7]
]
解题思路:
这道题其实是二叉树的广度优先遍历,除了广度优先遍历整个二叉树意外,需要解决的问题就是把所有的元素按层分组。
广度优先遍历的大概思路是这样的:创建一个队列(或者类似的数据结构),从根节点开始,每当遍历到一个节点,就把它的子节点依次放入队列中,然后从队列中依次取出节点,进行同样的操作,将每次去到的节点的字节点都依次放入队列中。当队列中的节点都被取完之后,二叉树的广度优先遍历就完成了。
这道题要求的结果中,需要把每一层的元素分组成单独的数组。我们可以这样做:首先,跟节点为第一层,开始的时候,先把跟节点放入队列。然后在队列不为空的条件下进行循环,每次循环开始,都先获取队列的长度,这个长度就是当前层的节点的个数,比如第一次循环的时候,之后跟节点,长度为1,知道这个长度(假设为 n)后,每次只取队列中前 n 个节点,这些节点就是当层所有的节点,取完之后队列中还剩下的节点就是下一层所有的节点。以此类推,当队列中没有节点之后,就遍历完了所有的节点。在每次循环时,创建一个列表保存当前层的所有元素,循环的最后再将其添加入最终的结果结果集列表中。
最终代码:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> level = new ArrayList<Integer>();
int currentLevelSize = queue.size();
for (int i = 1; i <= currentLevelSize; i++) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
result.add(level);
}
return result;
}
}