题目描述
层序遍历,层与层之间划分,且从底层到顶层遍历
解法
- bfs+反转二维列表
层序遍历是最简单的。其次就是要求我们层与层遍历结果分开。而这题要求我们从底层到顶层,我们只需要将上一结果反转即可。
如何做到层与层之间比哪里结果分开?每一次大循环保存队列的初始元素个数。此即该层的元素个数。剩下的就很简单了。
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new LinkedList<>();
if (root == null)
return res;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.addLast(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> tmpL = new LinkedList<>();
for (int i = 0; i < size; i++) {
TreeNode tmpN = queue.removeFirst();
tmpL.add(tmpN.val);
if (tmpN.left != null)
queue.addLast(tmpN.left);
if (tmpN.right != null)
queue.addLast(tmpN.right);
}
res.add(tmpL);
}
int size = res.size();
//反转结果二维列表
for (int i = 0; i < size / 2; i++) {
List<Integer> tmp = res.get(i);
res.set(i, res.get(size - i - 1));
res.set(size - i - 1, tmp);
}
return res;
}
}