题目:
Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root).
解答:
解法一:
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> result=new ArrayList<>();
List<TreeNode> curnode=new ArrayList<>(); //当前层的所有节点
if(root==null){
return result;
}
curnode.add(root);
while(!curnode.isEmpty()){
List<Integer> list=new ArrayList<>();
List<TreeNode> nextnode=new ArrayList<>(); //下一层的所有节点
for(TreeNode cur:curnode){
list.add(cur.val);
if(cur.left!=null){
nextnode.add(cur.left);
}
if(cur.right!=null){
nextnode.add(cur.right);
}
}
curnode=nextnode;
result.add(0,list);
}
return result;
}
}
一开始在倒序插入result中为难,想到用stack,或者Collections.reverse(list);
对list进行反转。后来发现忽略了List.add()
方法中的语法void add(int index,E element)
可用于在列表的指定位置插入指定元素,并将当前处于该位置的元素及其后续元素的索引加 1。因此本题中只需要用result.add(0,list);
即可直接实现倒序插入。
解法二:递归
后来看到了他人的递归解法,借鉴学习一下
其中,level用于记录当前所在的层数
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> result=new LinkedList<>();
levelRecursion(root,result,0);
return result;
}
//递归方法
private void levelRecursion(TreeNode node,LinkedList<List<Integer>> result,int level){
if(node==null){
return;
}
if(result.size()<level+1){//说明还需要增加一层的节点
result.addFirst(new ArrayList<Integer> ());
}
result.get(result.size()-1-level).add(node.val);
levelRecursion(node.left,result,level+1);
levelRecursion(node.right,result,level+1);
}
}
其中定义了LinkedList 集合类,即采用链表存储的方法,插入、删除元素效率比较高
void addFirst (Object o)
在列表首部添加元素
void addLast (Object o)
在列表末尾添加元素
Object getFirst()
返回列表第一个元素
Object getLast()
返回列表最后一个元素
Object removeFirst()
删除列表中第一个元素
Object removeLast()
删除列表中最后一个元素
LeetCode计算效率显示,递归比非递归效率较高一些