107. 二叉树的层次遍历 II
题目
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
这个题和我上一篇的102. 二叉树的层序遍历(一)是异曲同工的,建议先去看我的上一篇,解释详细
这个题仍然是可以用两种方法来的,但是返回的时候要求是从底部往上面返回,那么就说明在添加list的时候要倒着添加,list有一个add方法是先写索引,再写上插入的元素。所以这就是和上面那个题的区别,建议先看上一篇的解释,再看接下来的代码,比较不同之处。
BFS
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if (root==null){
return new ArrayList<List<Integer>>();
}
//先是bfs
List<List<Integer>> lists=new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
int size=queue.size();
List<Integer> list=new ArrayList<>();
for (int i = 0; i <size; i++) {
TreeNode treeNode=queue.poll();
list.add(treeNode.val);
if (treeNode.left!=null){
queue.add(treeNode.left);
}
if (treeNode.right!=null){
queue.add(treeNode.right);
}
}
lists.add(0,list);
}
return lists;
}
DFS
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if (root==null){
return new ArrayList<List<Integer>>();
}
List<List<Integer>> lists =new ArrayList<>();
dfs(1,root,lists);
return lists;
}
public void dfs(int index,TreeNode treeNode,List<List<Integer>> lists){
if (lists.size()<index){
lists.add(0,new ArrayList<Integer>());
}
lists.get(lists.size()-index).add(treeNode.val);
if (treeNode.left!=null){
dfs(index+1,treeNode.left,lists);
}
if (treeNode.right!=null){
dfs(index+1,treeNode.right,lists);
}
}