剑指offer从上到下打印二叉树

本文详细介绍了如何使用队列实现二叉树的广度优先遍历,包括使用ArrayList和Queue的具体代码实现,以及牛客网上的运行结果。同时,文章还探讨了如何避免在遍历时出现节点重复的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今日你如约而至了吗?互相监督打卡学习哦~上题:

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

分析:
题目的意思其实就是对二叉树的层序遍历。
!!!!
此题实际为二叉树的广度遍历,广度遍历必须借助其他的数据结构队列才能进行,比如最常见的Queue
//(不能直接递归哦)
!!!!
我一开始想用迭代的思想,但是输出的结果有重复,用while循环,没有中间桥梁依旧会重复。
所以
    1、设置一个中间缓存区(可以是ArrayList,Queue或者其他都可以,只是起一个暂时存储临时根结点的作用)存储临时根结点。
    2、从缓存区中取出第一个结点,即为当前结点。
    3、将当前结点的值存入列表中,在缓冲区中删除当前结点;
    4、将当前结点的左结点和右结点分别存入缓冲区中。
    5、重复步骤2~4,知道结束;

代码:
import java.util.ArrayList;
/**
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<Integer> list1 = new ArrayList<>();
        if(root==null)return list1;      //初始化要判断!
        ArrayList<TreeNode> list2 = new ArrayList<>();   //缓冲区
        list2.add(root);
        while(list2.size()!=0){
            TreeNode temp = list2.get(0);
            list2.remove(0);
            list1.add(temp.val);      //将当前结点的值存入列表中
            if(temp.left!=null)list2.add(temp.left);   //将左节点和右节点存入缓冲区中。
            if(temp.right!=null)list2.add(temp.right);
        }
        return list1;
    }
}
牛客运行通过
运行时间:18ms
运行内存:9160Kb
这里是借助了一个缓冲区,相当于增大了空间复杂度,但是不用缓冲区容易重复~~~。

再用Queue实现:因为Queue有先进先出的特点,而且可以直接取出并删除元素。
Queue中的一些用法:
添加元素:add(不推荐,报异常),offer(推荐)
add(E e) : 将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则会抛出异常;
remove() :移除队首元素,若移除成功,则返回true;如果移除失败(队列为空),则会抛出异常;
offer(E e) :将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则返回false;
poll() :移除并获取队首元素,若成功,则返回队首元素;否则返回null;
peek() :获取队首元素,若成功,则返回队首元素;否则返回null
推荐使用后面三个,不会报异常。
代码:
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/**
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<Integer> list1 = new ArrayList<>();
        if(root==null)return list1;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode temp = queue.poll();    //取出第一个元素并删除
            list1.add(temp.val);        
            if(temp.left!=null)queue.offer(temp.left);   //将左右结点存入到队列中。
            if(temp.right!=null)queue.offer(temp.right);
        }
        return list1;
    }
}
牛客运行通过
运行时间:20ms
运行内存:9416Kb
二叉树的广度优先遍历是需要借助的,一般借助队列实现。
举一反三:按行从上到下打印二叉树
这个其实和上面一样需要借助队列,但同时还需要两个变量,一个记录当前行的个数,一个记录下一行的个数。
所以需要添加几个if判断语句即可实现。
欢迎各位互相监督学习哦~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值