通俗易懂的解决 剑指 Offer 32 从上到下打印二叉树

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

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

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

3

/ \

9 20

/ \

15 7

返回:

[3,9,20,15,7]

解题思路

  • 根据题意可以看出要求的是二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。

  • BFS 通常借助 队列 的先入先出特性来实现。

算法流程:

  1. 特殊处理:当根节点为空时,由于题目给的返回值是int型数组,因此返回一个空数组

  1. 初始化:返回结果res[], 队列Deque,存放每个节点值的List集合。

  1. 实现逻辑:首先将头节点放入队列Deque中,进入循环中,循环结束条件是队列为空,代表二叉树已经遍历完了,首先将队列中的节点弹出,list存放弹出节点的值,再将每个节点的左右子节点放入到队列中,最终循环结束,所有节点都已经存放到list集合中,由于题目要求返回int集合,因为我们将list集合转为int数组即可。

实现逻辑图:(这图是我手画的,可能有些人容易理解,有些人有些看不懂,大家可以根据代码推导一下看一下到底是不是这个样子)

实现代码:

classSolution {
    publicList<Integer>list;//存放每个节点值
    publicint[] levelOrder(TreeNoderoot) {
        if(root==null) returnnewint[0]; //针对头节点为空处理
        list=newArrayList<>();
        Deque<TreeNode>deque=newLinkedList<>();//队列用来存放每个节点
        deque.add(root);
        while(!deque.isEmpty()){
            TreeNodenode=deque.poll(); //从队列弹出一个节点
            list.add(node.val);  // 将弹出节点的值放入到队列中
            if(node.left!=null) deque.add(node.left); 
            if(node.right!=null) deque.add(node.right);
        }
        int[] arr=newint[list.size()];
        for(inti=0; i<list.size(); i++){
            arr[i] =list.get(i);
        }
        return arr;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值