层次遍历二叉树,每一次储存在list中,结果按从叶子层到根,从左到右的顺序存储
代码一:
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
func(lists, 0, root); //遍历
//逆转List
for (int i = 0, j = lists.size() - 1; i < j; i++, j--) {
List<Integer> temp = lists.get(i);
lists.set(i, lists.get(j));
lists.set(j, temp);
}
return lists;
}
//相当于在先序的基础上改进,level是每个node所在的层次。
//如果lists大小和level相等,说明开始新一层的存储。
//如果不等,则直接把值存入相应层次的list中。
private void func(List<List<Integer>> lists, int level, TreeNode root) {
if (root == null) {
return;
}
if (lists.size() == level) {
//相等,新建该层的list并将node存入
List<Integer> list = new ArrayList<>();
list.add(root.val);
lists.add(list);
} else {
//不等,说明list已有,存入即可
lists.get(level).add(root.val);
}
func(lists, level + 1, root.left);
func(lists, level + 1, root.right);
}
}
代码二:队列:
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
Queue<TreeNode> q = new ArrayDeque<TreeNode>();
if(root==null)
return res;
TreeNode left = null;
TreeNode right = null;
TreeNode temp = root;
q.add(root);
int size = 1;
while(true){
size = q.size(); //只在这里更新size的值
ArrayList<Integer> inner = new ArrayList<Integer>();
while(size!=0){
temp = q.poll();
inner.add(temp.val);
size--;
left = temp.left;
right = temp.right;
//虽然有把节点添加到队列中,但是并没有更新size的值,所以该层
//while相当于是遍历每层!
if(left!=null)
q.add(left);
if(right!=null)
q.add(right);
}
res.add(inner);
if(q.size()==0)
break;
}
Collections.reverse(res);
return res;
}
}
其他思路:设置first和last标记node,来找出每层的开始结束位置。