目录结构
1.题目
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
根据题意,通过队列辅助进行层次遍历;且每层遍历结束后,采用头插法将该层结果插入到最终结果中,以保证为自底向上。
- lists存放最终结果;
- list存放当前层结果;
- num记录当前层剩余未遍历的节点数;
- count记录当前层遍历时,从左往右入队的子节点的个数(对遍历的每个节点,检查其左右子节点,不为空则入队)。
- 当前层遍历结束,将该层结果list头插法加入最终结果lists,并将num新赋值为count,list重新申请空间,开始下一层遍历。
public class Solution107 {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
int num = 1, count = 0;
Queue<TreeNode> tn = new LinkedList<>();
List<Integer> list = new ArrayList<>();
List<List<Integer>> lists = new LinkedList<>();
if (root != null) {
tn.offer(root);
} else {
return lists;
}
while (!tn.isEmpty()) {
TreeNode t = tn.poll();
list.add(t.val);
num--;
if (t.left != null) {
tn.offer(t.left);
count++;
}
if (t.right != null) {
tn.offer(t.right);
count++;
}
if (num == 0) {
lists.add(0, list);
list = new ArrayList<>();
num = count;
count = 0;
}
}
return lists;
}
}
- 时间复杂度:
- 空间复杂度: