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

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

层次遍历

题解

层次遍历首先应该想到的就是借助队列来实现。

为什么需要用Queue来解决层序遍历?
Queue特点:先进先出
tree特点:获取的上一层,才能得到下一层
解决方案:从queue中出来一个Node,就把其左右孩子,加入Queue

  1. 需要借助两种数据结构 Queue(用 LinkedList 来实现)和List(用 ArrayList 来实现)
  2. Queue的作用是根据出队列的节点,通过判空之后,将左右孩子入队列
  3. List的作用是将 出队列的节点的值 进行保存
  4. 注意将List转换成数组

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

class Solution {
    
    
    // 利用 queue 的特性来进行层序遍历
    Queue<TreeNode> queue = new LinkedList<>();
    // 利用 list 来用于保存遍历的数据
    List<Integer> list = new ArrayList<>();

    public int[] levelOrder(TreeNode root) {
    
    
        int[] res = new int[0];
        if(root==null){
    
    
            return res;
        }
        // 核心方案:queue中取出一个元素,再把其左右孩子加入 queue
        queue.add(root);

        while (!queue.isEmpty()){
    
    
            TreeNode node = queue.remove();
            list.add(node.val);
            if(node.left!=null){
    
    
                queue.add(node.left);
            }
            if(node.right!=null){
    
    
                queue.add(node.right);
            }
        }
        // 把 ArrayList 类型转换为 int[] 数组
        res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
    
    
            res[i] = list.get(i);
        }
        return res;
    }
}

题解

每层都放入一个 List,通过for循环queue.size()来分辨每一层

class Solution {
    
    
    Queue<TreeNode> queue = new LinkedList<>();
    List<List<Integer>> ret = new ArrayList<>();
    public List<List<Integer>> levelOrder(TreeNode root) {
    
    
        if(root==null){
    
    
            return ret;
        }
        queue.add(root);

        while(!queue.isEmpty()){
    
    
            List<Integer> list = new ArrayList<>();
            int size = queue.size();
            for(int i=0;i<size;i++){
    
    
                TreeNode node = queue.remove();
                list.add(node.val);
                if(node.left!=null){
    
    
                    queue.add(node.left);
                }
                if(node.right!=null){
    
    
                    queue.add(node.right);
                }
            }
            ret.add(list);
        }
        return ret;
    }
}

题解

需要引入一个标记位 flag 表示当前插入的尾插还是头插(需要将插入下标设置为0)

Z型,通过 list 中的尾部追加 -> 头部插入

class Solution {
    
    
    List<List<Integer>> ret = new ArrayList<>();
    Queue<TreeNode> queue = new LinkedList<>();

    public List<List<Integer>> levelOrder(TreeNode root) {
    
    
        if(root==null){
    
    
            return ret;
        }
        queue.add(root);
        Boolean flag = true;
        while(!queue.isEmpty()){
    
    
            List<Integer> list = new ArrayList<>();
            int size = queue.size();
            for(int i=0;i<size;i++){
    
    
                TreeNode node = queue.remove();

                if(flag){
    
    
                    list.add(node.val); //奇数行,list尾插追加
                }else{
    
    
                    list.add(0,node.val);// 偶数行,list中头部插入
                }
                if(node.left!=null){
    
    
                    queue.add(node.left);
                }
                if(node.right!=null){
    
    
                    queue.add(node.right);
                }
            }
            flag = !flag;
            ret.add(list);
        }
        return ret;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39537400/article/details/123957188
今日推荐