给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
递归:每一层都需要一个集合来存储本层的节点值,判断当前节点是那一层,然后取出对应层的集合,并往其中添加当前节点值,递归时需指定当前节点属于那一层。
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> levels = new ArrayList<>();
if (root == null) return levels;
levelOrder(root, 0, levels);
return levels;
}
public static void levelOrder(TreeNode node, int level, List<List<Integer>> levels) {
if (levels.size() == level)
levels.add(new ArrayList<>());
levels.get(level).add(node.val);
if (node.left != null)
levelOrder(node.left, level + 1, levels);
if (node.right != null)
levelOrder(node.right, level + 1, levels);
}
迭代:每遍历一层节点,就存储该层节点的值,并且存储下一层的左右节点,然后一直遍历结束,直到节点集合为空。
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> trees = new LinkedList<>();
trees.add(root);
while (!trees.isEmpty()) {
int size = trees.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode tree = trees.poll();
list.add(tree.val);
if (tree.left!= null) {
trees.add(tree.left);
}
if (tree.right != null) {
trees.add(tree.right);
}
}
result.add(list);
}
return result;
}