给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
递归:每一层都需要一个集合来存储本层的节点值,判断当前节点是那一层,然后取出对应层的集合,并往其中添加当前节点值,递归时需指定当前节点属于那一层。最后把集合中的元素进行反转。
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> levels = new LinkedList<>();
if (root == null) return levels;
levelOrder(root, 0, levels);
Collections.reverse(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) {
LinkedList<List<Integer>> result = new LinkedList<>();
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.addFirst(list);
}
return result;
}