public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if (root==null) return lists;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int levelSize = 1;
List<Integer> levelList = new ArrayList<>();
while (!queue.isEmpty()){
TreeNode node = queue.poll();
levelList.add(node.val);
levelSize--;
if (node.left!=null) queue.offer(node.left);
if (node.right!=null) queue.offer(node.right);
if (levelSize==0){
levelSize = queue.size();
lists.add(0,levelList);
levelList = new ArrayList<>();
}
}
return lists;
}
思路
- 由于使每一层都有自己的levelList,所以用一个嵌套的list来保存返回结果
- 如果root==null,直接返回嵌套空表
- 将root存进队列,并创建levelList表对象
- 队列弹出节点,将节点值存进levelList,levelSize减1
- 用levelSize判断当前层的节点是否完全遍历
- levelSize==0时,将当前层的levelList对象存进list中(注意,是往表头添加),并给levelList创建空表,最后将下一层节点数目(即队列大小)赋给levelSize
- 返回list
这道题我是投机取巧了,其实如果看过我102. 二叉树的层序遍历的题解的朋友可以发现,其实我仅仅是改变了levelList添加进lists的位置,一个是表头、一个是表尾