剑指 Offer 32 – II. 从上到下打印二叉树

剑指 Offer 32 - II. 从上到下打印二叉树 II

和上道题目剑指 Offer 32 – I. 从上到下打印二叉树相似,都是需要层次遍历二叉树,不同的是,需要将同一层的元素放在一个数组中。

为了将同一层的元素放到一个数组汇总,需要记录每一层的元素个数,可以直接通过队列的长度来获取

// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        // 设置 res 用来保存输出结果
        List<List<Integer>> res = new ArrayList<>();
        // 边界情况处理
        if(root == null) return res;

        // 设置一个队列,用来存储二叉树中的元素
        Queue<TreeNode> queue = new LinkedList<>();
        // 队列添加二叉树的根节点
        queue.add(root);

        // 遍历队列,直到队列为空,说明访问了二叉树中所有的节点
        while(!queue.isEmpty()){  
            // 用来记录 queue 的长度,即每层节点的个数
            int size = queue.size();  

            // 用来保存每一层节点,保存成功后添加到 res 中
            List<Integer> temp =  new ArrayList<>(); 

            // 使用 for 循环,将 queue 中的元素添加的 temp 中
            for(int i = 0 ; i < size ;  i++ ){     
                // 从 queue 中取出一个节点         
                TreeNode node = queue.poll();  
                // 把节点存放到 list 中
                temp.add(node.val);  //将节点值加入list

                // 判断当前节点的左子节点是否有值,如果有,则添加到 queue 中
                if(node.left != null)
                    queue.add(node.left);

                // 判断当前节点的右子节点是否有值,如果有,则添加到 queue 中    
                if(node.right != null)
                    queue.add(node.right);
            }

            // 把存放了每一层元素的数组 temp 添加到 res 中
            res.add(temp);
        }

        // 返回 res
        return res;       
    }   
}

 

ArrayList和LinkedList的区别

        ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。

        LinkedList使用了循环双向链表数据结构。与基于数组ArrayList相比,这是两种截然不同的实现技术,这也决定了它们将适用于完全不同的工作场景。

        LinkedList链表由一系列表项连接而成。一个表项总是包含3个部分:元素内容,前驱表和后驱表,如图所示:

        在下图展示了一个包含3个元素的LinkedList的各个表项间的连接关系。在JDK的实现中,无论LikedList是否为空,链表内部都有一个header表项,它既表示链表的开始,也表示链表的结尾。表项header的后驱表项便是链表中第一个元素,表项header的前驱表项便是链表中最后一个元素。

Java常用API(ArrayList类)

我们为什么要使用ArrayList类?

为了更加方便的储存对象,因为使用普通的数组来存储对象太过麻烦了,因为数组的一个很大的弱点就是长度从一开始就固定了,所以Java提供了另一个容器 java.util.ArrayList 集合类,让我们可以更便捷的存储和操作对象数据

什么是ArrayList?

所以从上面的介绍就可以看出所谓的ArrayList类就是一个长度可变的数组。

ArrayList API

•ArrayList ( )
构造一个空数组列表。


•ArrayList ( int initialCapacity)
用指定容量构造一个空数组列表。
参数:initalCapacity 数组列表的最初容量


•boolean add( E obj )
在数组列表的尾端添加一个元素。 永远返回 true。
参数:obj 添加的元素


•int size( )
返回存储在数组列表中的当前元素数量。(这个值将小于或等于数组列表的容量。)


•void ensureCapacity( int capacity)
确保数组列表在不重新分配存储空间的情况下就能够保存给定数量的元素。
参数:capacity 需要的存储容量


•void trimToSize( )
将数组列表的存储容量削减到当前尺寸。


• void set(int index,E obj)
设置数组列表指定位置的元素值, 这个操作将覆盖这个位置的原有内容。
参数: index 位置(必须介于 0 ~ size()-1 之间)
obj 新的值


• E get(int index)
获得指定位置的元素值。
参数:index 获得的元素位置(必须介于 0 ~ size()-l 之间)


• void add(int index,E obj)
向后移动元素,以便插入元素。
参数:index 插入位置(必须介于 0 〜 size()-l 之间)
obj 新元素


• E remove (int index)
删除一个元素,并将后面的元素向前移动。被删除的元素由返回值返回。
参数:index 被删除的元素位置(必须介于 0 〜 size()-1之间)
————————————————
 

Java ArrayList常用接口介绍及示例

有用例