二叉树的层次遍历2
https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
public class LevelOrder {
public List<List<Integer>> levelOrderBottom(TreeNode root){
//如果root为空,也是要返回一个空的链表集合,所以,root为null,不能返回null,就是一个空的容器。对于以后的链表套链表的类似情况,要注意这个问题。
List<List<Integer>> ans=new LinkedList<>();
if(root==null){
return ans;
}
//按层遍历都要设置一个队列。
//为什么使用队列,因为队列符合本题的先进先出
Queue<TreeNode> queue=new LinkedList<>();
//先把头结点放入队列中,进行初始化,进入下面的while循环。
queue.add(root);
//当队列不为空时,一直执行。
while (!queue.isEmpty()){
//size:表示当前某一层的节点,因为queue里的值是动态变化的,所以需要抓取特定时刻的值。
int size=queue.size();
//list:表示存储每一层节点的链表
List<Integer> list=new LinkedList<>();
for(int i=0;i<size;i++){
TreeNode pollNode=queue.poll();
list.add(pollNode.val);
//如果左节点不为空,将左节点加入到队列中。
if(pollNode.left!=null){
queue.add(pollNode.left);
}
//如果右节点不为空,将右节点加入到队列中。
if(pollNode.right!=null){
queue.add(pollNode.right);
}
}
//因为LinkedList的弹出是从头部开始弹出。由于是从最底层开始输出,因此,只有每次将每层的节点放入到LinkedList的头部,才可能实现最后放进去,最先出来。
ans.add(0,list);
}
return ans;
}
}
总结
1.选择合适的数据结构,比如,本题中选择LinkedList,是因为可以很方便的在头部进行插入。如果是ArrayList,则需要移动很多次位置,时间复杂度高。
2.进行层次遍历都要用到队列Queue。