LeetCode 从上到下打印二叉树

这是我参与更文挑战的第 25 天,活动详情查看: 更文挑战

从上到下打印二叉树(剑指 Offer32-1)

题目描述

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

例如:
给定二叉树: [3,9,20,null,null,15,7]

示例 1:

    3
   / \
  9  20
    /  \
   15   7
复制代码

返回:

[3,9,20,15,7]
复制代码

提示

  • 节点总数 <= 1000

思路分析

从上到下打印二叉树,我们可以通过一个队列去不断遍历,一开始将第一层的节点放到该队列中,然后遍历这个队列中的节点,可以得到第二层的所有节点,并且将这些节点放到队列中,之后再遍历这一层的节点,我们就可以得到第三层的所有节点,之后继续遍历队列中的所有节点,我们就可以打印第四层的节点,这样不断的遍历,得到所有的节点。最后我们在遍历这些节点,将其放到数组中,并返回。

代码展示

解法一:

public int[] levelOrder(TreeNode root) {
        if(root == null){
            return new int[0];
        }
        List<Integer> result = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            result.add(node.val);
            if(node.left != null){
                queue.add(node.left);
            }
            if(node.right != null){
                queue.add(node.right);
            }
        }
        int[] arr = new int[result.size()];
        for(int i = 0;i < result.size();i++){
            arr[i] = result.get(i);
        }
        return arr;
    }
复制代码

从上到下打印二叉树(剑指 Offer32-3)

题目描述

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

例如:
给定二叉树: [3,9,20,null,null,15,7],

示例 1:

    3
   / \
  9  20
    /  \
   15   7
复制代码

返回其层次遍历结果:

[
  [3],
  [20,9],
  [15,7]
]
复制代码

提示

  • 节点总数 <= 1000

思路分析

这道题和上面那道题很相似,只不过需要返回的是一个二维数组,从上到下打印二叉树,我们可以通过一个队列去不断遍历,一开始将第一层的节点放到该队列中,然后遍历这个队列中的节点,可以得到第二层的所有节点,并且将这些节点放到队列中,之后再遍历这一层的节点,我们就可以得到第三层的所有节点,之后继续遍历队列中的所有节点,我们就可以打印第四层的节点,这样不断的遍历,得到所有的节点。最后我们在遍历这些节点,将其放到数组中,并返回。

同时打印使用之字形打印每一层的节点,这个时候我们需要在每次遍历节点的做下处理,提前获取遍历队列的大小,然后放大二维数组的某一项中,之字形打印我们使用奇数和偶数进行判断。

代码展示

解法一:

public List<List<Integer>> levelOrder(TreeNode root) {
        
        List<List<Integer>> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int deep = 1;
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> innerList = new ArrayList<>();
            if(deep % 2 != 0){
                for(int i = 0;i < size;i++){
                    TreeNode node = queue.poll();
                    innerList.add(node.val);
                    if(node.left != null){
                        queue.add(node.left);
                    }
                    if(node.right != null){
                        queue.add(node.right);
                    }
                }
            } else {
                for(int i = 0;i < size;i++){
                    TreeNode node = queue.poll();
                    innerList.add(0,node.val);
                    if(node.left != null){
                        queue.add(node.left);
                    }
                    if(node.right != null){
                        queue.add(node.right);
                    }
                }
            }
            deep++;
            result.add(innerList);
        }
        return result;

    }
复制代码

总结

从上到下打印也就是层序遍历,我们也应该掌握这种二叉树的遍历做法。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享