剑指Offer-->从上向下打印二叉树(★★)

本文介绍了一种使用队列实现的二叉树层序遍历算法,具体步骤包括:1. 将根节点入队;2. 出队并获取节点值,将其子节点入队;3. 重复步骤2直至队列为空。该算法适用于从上至下、从左到右打印二叉树的所有节点。

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

  这道题目难度一般,重要的是想到以队列作为辅助来解决。
    分析:因为按层打印的顺序决定了先打印的应该为根结点。为了接下来能够打印值为 8 的结点的两个子结点,应该在遍历到该结点时把值为 6 和 10 的两个结点保存到一个容器里,此时容器中含有 6 和 10 两个结点。按照从左到右的要求,先取出值为 6 的结点。打印出值 6 之后分别把 5 和 7 两个左右子结点放入容器 ,此时容器中的结点有三个,分别是10 、 5 和 7 。接下来我们从容器中取出值为 10 的结点,注意到 10 比另外两个元素先进入,因此先将 10 取出,并再把 10 的两个结点放入,此时容器中的元素为 5 、 7 、 9 、 11。由此可以看出取元素的顺序符合先进先出原则,我们则判断需要通过队列来解决这个问题。由于这四个结点都没有子结点,因此只需要依次打印即可。打印过程如图所示:


package T21;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
/**
 * 题目描述:
* 从上往下打印出二叉树的每个节点,同层节点从左至右打印(即层序遍历)
 * 1.元素 8 出队,放入list,得到 6 、 10
 * 2.元素 6 出队,放入list,得到 (10) 5 、7
 * 3.元素 10 出队,放入list,得到 (5) (7) (9) (11)
 * 4.均无子结点,直接打印
*/

public class Solution {
    //建立一个数组双端队列,是大小可变数组。线程不安全,但在速度上有一定的优势。
    Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
    ArrayList<Integer> list = new ArrayList<Integer>();

    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
    if(root == null)
        return list;
    queue.add(root);  //将结点入队
    while(!queue.isEmpty()){
        TreeNode treeNode = queue.poll(); //将元素出队并保存
        list.add(treeNode.val); //将元素的值取到并添加到集合中

        if(treeNode.left != null)
            queue.add(treeNode.left);
        if(treeNode.right != null)
            queue.add(treeNode.right);
    }
    return list;
    }
}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值