剑指offer打卡26-从上往下打印二叉树(java版)

剑指offer打卡26-从上往下打印二叉树(java版)

1. 考察知识点

  • 二叉树、数组、队列

2. 题目

  • 从上往下打印出二叉树的每个节点,同层节点从左至右打印。

3. 思路

从根节点开始遍历,判断每个节点是否有左右子节点,如果有的话一次加到ArrayList中
例如:
在这里插入图片描述

步骤:

  1. 将二叉树当成一个队列queue,队列有先进先出的特性。
  2. 将二叉树的第一个节点利用queued.poll 删除并获取值,然后判断该节点是否有左右子节点,如果有将左右子节点插入到队列最后。
  3. 再将队列的第二个节点利用queued.poll 删除并获取值,然后判断该节点是否有左右子节点,如果有将左右子节点插入到队列最后。
  4. 。。。。。。。

queue队列知识
队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部)

用法:remove、element、offer 、poll、peek 其实是属于Queue接口
1. add 增加一个元素      如果队列已满,则抛出一个IllegalSlabEepeplian异常
2. remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常
3. element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常
4. offer       添加一个元素并返回true       如果队列已满,则返回false
5. poll         移除并返问队列头部的元素    如果队列为空,则返回null
6. peek       返回队列头部的元素             如果队列为空,则返回null
7. put         添加一个元素                      如果队列满,则阻塞
8. take        移除并返回队列头部的元素     如果队列为空,则阻塞

offer,add区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
poll,remove区别:
remove() 和 poll() 方法都是从队列中删除第一个元素(head)。remove() 的行为与 Collection 接口的版本相似,
但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

4. 代码实现

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
    import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
     // 用 ArrayList 来保存二叉树的输出结果
        ArrayList resultList = new ArrayList();
        if (root == null){
            return resultList;
        }

        // 用 queue 保存当前遍历到了那个节点,queue为队列,可删除头节点并返回删除后的头节点的值
        Queue<TreeNode> queue = new LinkedList<>();

        // 将二叉树存放在队列中
        TreeNode current = root;
        queue.add(current);

        // 只要队列不为空,将该第一个节点并添加到ArrayList中,判断该节点是否有左右子节点,如果有也一起添加到ArrayList中x
        while (!queue.isEmpty()){
            current = queue.poll();
            resultList.add(current.val);

            if (current.left != null){
                queue.add(current.left);
            }
            if (current.right != null){
                queue.add(current.right);
            }
        }

        return resultList;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值