LeetCode 107. Binary Tree Level Order Traversal II 二叉树的层次遍历(Java)

题目:

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计算效率显示,递归比非递归效率较高一些
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值