问题:
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
这个问题需要我们按照深度逐渐递增的顺序,
从左到右依次输出每个深度对应节点的值。
代码示例:
这个问题比较容易的想法是:
在保存每一层节点值的同时,保存这一层的节点。
然后,在要输出下一层节点值时,
按照上一层节点的顺序,以此取值。
例如:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//用于保存结果
List<List<Integer>> rst = new ArrayList<>();
if (root != null) {
//记录这一层的值
List<Integer> valList = new ArrayList<>();
valList.add(root.val);
rst.add(valList);
//保存这一层的节点
List<TreeNode> nodeList = new ArrayList<>();
nodeList.add(root);
//递归
innerHelper(rst, nodeList);
}
return rst;
}
private void innerHelper(List<List<Integer>> rst, List<TreeNode> lastNodeList) {
//上一层有节点
if (lastNodeList.size() > 0) {
//用于保存这一层的值
List<Integer> valList = new ArrayList<>();
//用于保存这一层的节点
List<TreeNode> nodeList = new ArrayList<>();
//按照上一层节点的顺序,从左到右以此保存子节点的值和节点本身
for (TreeNode node: lastNodeList) {
if (node != null) {
//先左
if (node.left != null) {
valList.add(node.left.val);
nodeList.add(node.left);
}
//后右
if (node.right != null) {
valList.add(node.right.val);
nodeList.add(node.right);
}
}
}
//下一层有实际信息时,才继续递归
if (nodeList.size() > 0) {
rst.add(valList);
innerHelper(rst, nodeList);
}
}
}
}