【java】剑指offer32-I_从上到下打印二叉树

122 篇文章 0 订阅

题目描述:

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

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

    3
   / \
  9  20
    /  \
   15   7
返回:

[3,9,20,15,7]

提示:

节点总数 <= 1000

参考解题思路:光度优先,利用队列存放二叉树的节点,当队列为空时跳出while循环,每次取出队列的头元素,判断该元素的左右子节点是否为空,不为空则追加进队列

  • 特例处理: 当树的根节点为空,则直接返回空列表 [] ;
  • 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
  • BFS 循环: 当队列 queue 为空时跳出;
  1. 出队: 队首元素出队,记为 node;
  2. 打印: 将 node.val 添加至列表 tmp 尾部;
  3. 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
  • 返回值: 返回打印结果列表 res 即可。
public int[] levelOrder(TreeNode root) {
        // root为空判断
        if (root == null) {
            return new int[]{};
        }
        List<Integer> list = new ArrayList<>(); // 定义存放节点集合
        Queue<TreeNode> queue = new LinkedList<>(); // 定义存放节点队列
        queue.offer(root); // 加入初始根节点
        while (!queue.isEmpty()) { // 队列不为空则进入while循环
            TreeNode node = queue.poll(); // 取出队列头节点元素
            list.add(node.val); // 节点追击进集合
            // 该节点左右子节点是否为空--不为空则追加进队列元素中
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        // 节点集合转为数组
        int[] array = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            array[i] = list.get(i);
        }
        return array;
    }

复杂度分析:
时间复杂度 O(N): N为二叉树的节点数量,即 BFS 需循环 N 次。
空间复杂度 O(N): 最差情况下,即当树为平衡二叉树时,最多有N/2 个树节点同时在 queue 中,使用O(N)大小的额外空间。

作者:jyd
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/solution/mian-shi-ti-32-i-cong-shang-dao-xia-da-yin-er-ch-4/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值