剑指Offer面试题:25.从上往下打印二叉树

一、题目
————————————————
题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
图片说明
————————————————
二、思路
————————————————
这道题实质是在考查树的遍历算法。只是这种遍历不是我们熟悉的前序(根左右)、中序(左根右)、后序(左右根)遍历。故就需要从树及打印列表分析。分析上图二叉树的层次打印顺序
图片说明
通过上图的具体例子的分析,我们可以找到从上到下打印二叉树的规律:每一次打印一个结点的时候,如果该结点有子结点,则把该结点的子结点放到队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被打印出来为止。
————————————————
三、解决问题
————————————————
二叉树结点的定义如下:

package swordoffer;

/**
 * 二叉树结点的定义
 * @author LQ
 * @version 1.0
 * @date 2020-03-13 15:56
 */
public class TreeNode {
    int val;

    TreeNode left;

    TreeNode right;

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

代码实现:

package swordoffer;

/**
 * @author LQ
 * @version 1.0
 * @date 2020-04-26 10:43
 */

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/**
 * 题目描述
 * 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
 */

public class Solution25 {
    public static void main(String[] args) {
        TreeNode root = createBinaryTree();
        System.out.println(new Solution25().PrintFromTopToBottom(root));
    }
    /**
     * 思路:
     * 1、利用队列进行层次遍历
     * 2、每次弹出队列中的一个元素,并把左右孩子加入队列即可
     */
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        //queue用来保存当前遍历到了哪个节点,一次性把一个节点的左右子都入队
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        //list用来保存输出的节点
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(null == root){//注意:空树返回一个默认构造的空LinkedList,而不是一个空指针null
            return list;
        }
        //当前处理的节点
        TreeNode current = root;
        //将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时
        //此方法通常要优于add(E),后者可能无法插入元素,而只是抛出一个异常。
        queue.offer(current);
        //只要队列中还有节点就说明还没遍历完,继续。
        //每次从队列出队,然后将这个节点左右子入队列(FIFO,故能完成广度/层级遍历),再将这个节点记录在list中即可。
        while(!queue.isEmpty()){
            //弹出队列中的一个元素
            current = queue.poll();
            //将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true
            //如果当前没有可用的空间,则抛出 IllegalStateException
            list.add(current.val);//相当于打印
            // 左右孩子入队列
            if(current.left != null){//有左子则入队
                queue.offer(current.left);
            }
            if(current.right != null){
                queue.offer(current.right);
            }
        }
        return list;
    }
    private static TreeNode createBinaryTree() {
        TreeNode root = new TreeNode(8);
        TreeNode node1 = new TreeNode(6);
        TreeNode node2 = new TreeNode(10);

        root.left = node1;
        root.right = node2;

        TreeNode node3 = new TreeNode(5);
        TreeNode node4 = new TreeNode(7);
        TreeNode node5 = new TreeNode(9);
        TreeNode node6 = new TreeNode(11);

        node1.left = node3;
        node1.right = node4;

        node2.left = node5;
        node2.right = node6;

        return root;
    }
}

————————————————
图片说明
————————————————
努力也是需要学习的,别再让你的努力,只感动了自己!愿你的每一次努力,都能为自己和别人创造价值。

Java基础 文章被收录于专栏

建立本人的Java基础技术栈积累库

全部评论

相关推荐

伟大的烤冷面被普调:暨大✌🏻就是强
点赞 评论 收藏
分享
美丽的查理斯不讲武德:包kpi的啊,感觉虾皮一点hc都没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务