题目
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层序遍历为:
[
[15,7],
[9,20],
[3]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
和二叉树层序遍历I差不多,最后结果需要换下顺序,我的做法是放进栈里再拿出来,较好的做法是用Collection翻转下结果,最好的做法是插入的时候尾部插入。
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
Queue<TreeNode> que=new LinkedList<TreeNode>();
que.offer(root);
while(!que.isEmpty()){
List<Integer> res_=new ArrayList<Integer>();
for(int i=que.size();i>0;i--){
TreeNode tmp=que.poll();
res_.add(tmp.val);
if(tmp.left!=null) que.offer(tmp.left);
if(tmp.right!=null) que.offer(tmp.right);
}
res.add(res_);
}
Stack<List<Integer>> st = new Stack<>();
List<List<Integer>> res_f=new ArrayList<>();
for(int i=0;i<res.size();i++){
st.push(res.get(i));
}
while(!st.isEmpty()){
res_f.add(st.pop());
}
return res_f;
}
}
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
Queue<TreeNode> que=new LinkedList<TreeNode>();
que.offer(root);
while(!que.isEmpty()){
List<Integer> res_=new ArrayList<Integer>();
for(int i=que.size();i>0;i--){
TreeNode tmp=que.poll();
res_.add(tmp.val);
if(tmp.left!=null) que.offer(tmp.left);
if(tmp.right!=null) que.offer(tmp.right);
}
res.add(res_);
}
Collections.reverse(res);
return res;
}
}
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
Queue<TreeNode> que=new LinkedList<TreeNode>();
que.offer(root);
while(!que.isEmpty()){
List<Integer> res_=new ArrayList<Integer>();
for(int i=que.size();i>0;i--){
TreeNode tmp=que.poll();
res_.add(tmp.val);
if(tmp.left!=null) que.offer(tmp.left);
if(tmp.right!=null) que.offer(tmp.right);
}
res.add(0,res_);
}
return res;
}
}