给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解法一:
将每一层的节点放入队列,对于每一层新建一个 ArrayList,然后将队列里的元素的值存入这个 ArrayList,从而得到每一层的节点值。
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return new ArrayList<>();
List<List<Integer>> lists = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while (!q.isEmpty()) {
List<Integer> list = new ArrayList<>();
int n = q.size();
for (int i = 0; i < n; ++i) {
TreeNode t = q.poll();
list.add(t.val);
if (t.left != null) q.offer(t.left);
if (t.right != null) q.offer(t.right);
}
lists.add(list);
}
return lists;
}
解法二:
递归求解,核心就在于我们需要一个变量 level,当 level 递归到上一层的个数时(列表的个数),我们就新建一个空列表,继续往对应 level 的列表里面添加数字。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
reLevelOrder(root, 0, lists);
return lists;
}
public void reLevelOrder(TreeNode root, int level, List<List<Integer>> lists) {
if (root == null) {
return;
}
if (lists.size() == level) {
List<Integer> list = new ArrayList<>();
lists.add(list);
}
lists.get(level).add(root.val);
if (root.left != null) {
reLevelOrder(root.left, level + 1, lists);
}
if (root.right != null) {
reLevelOrder(root.right, level + 1, lists);
}
}