给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
感谢windliang大神的递归解法,传送门详细通俗的思路分析,多解法
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
// return levelOrderBottomI(root);
return levelOrderBottomII(root);
}
//方法二:递归,时间和空间复杂度O(N)
private List<List<Integer>> levelOrderBottomII(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> result = new ArrayList<>();
dfs(root, result, 0);
return result;
}
private void dfs(TreeNode root, List<List<Integer>> result, int depth) {
if (root == null) {
return;
}
if (result.size() == depth) {
result.add(0, new ArrayList<>());
}
//这里需要注意,与102题不同
//result.get(depth).add(root.val);
//index 0 1 2 3 4
//depth 0 1 2 3 4
//现在level是逆序的
//index 0 1 2 3 4
//depth 4 3 2 1 0
//index = 4 - depth,其中4就是数组的下表,也就是result.size() - 1
result.get(result.size() - 1 - depth).add(root.val);
dfs(root.left, result, depth + 1);
dfs(root.right, result, depth + 1);
}
//方法一:迭代,时间和空间复杂度O(N)
private List<List<Integer>> levelOrderBottomI(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> list = new ArrayList<>();
while (size-- > 0) {
TreeNode node = queue.poll();
if (node != null) {
list.add(node.val);
queue.add(node.left);
queue.add(node.right);
}
}
if (list.size() > 0) {
result.add(0, list);
}
}
return result;
}
}