《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ

简介: 《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ

《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ

1 从上到下打印二叉树Ⅰ

1.1 题目

https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/

1.2 思路

1.3 题解

二叉树类(下同):

/**
 * @desc: 二叉树类
 * @author: YanMingXin
 * @create: 2021/9/13-15:52
 **/
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) {
        val = x;
    }
}

算法代码:

/**
 * @desc: 剑指 Offer 32 - I. 从上到下打印二叉树
 * @author: YanMingXin
 * @create: 2021/9/13-14:28
 **/
public class Test01 {
    /**
     * 声明队列
     */
    private Queue<TreeNode> queue = new LinkedList<>();
    /**
     * 声明有序列表
     */
    private ArrayList<Integer> list = new ArrayList<>();
    /**
     * BFS解决
     *
     * @param root
     * @return
     */
    public int[] levelOrder(TreeNode root) {
        //判断临界值
        if (root == null) {
            return new int[0];
        }
        //将root放在队首
        queue.add(root);
        //进行循环
        while (!queue.isEmpty()) {
            //弹出队首元素放在List中
            TreeNode node = queue.poll();
            list.add(node.val);
            //广度优先搜索
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
        //将List换成数组
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }
}

2 从上到下打印二叉树Ⅱ

2.1 题目

https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/

2.2 思路

2.3 题解
/**
 * @desc: 剑指 Offer 32 - II. 从上到下打印二叉树 II
 * @author: YanMingXin
 * @create: 2021/9/13-14:52
 **/
public class Test02 {
    /**
     * 声明嵌套链表
     */
    private ArrayList<List<Integer>> list = new ArrayList<>();
    /**
     * 声明队列
     */
    private Queue<TreeNode> queue = new LinkedList<>();
    /**
     * BFS
     *
     * @param root
     * @return
     */
    public List<List<Integer>> levelOrder(TreeNode root) {
        //临界条件
        if (root != null) {
            queue.add(root);
        }
        while (!queue.isEmpty()) {
            List<Integer> tmp = new ArrayList<>();
            //将队列中的元素全部弹出
            for (int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                //list添加队列中弹出的元素
                tmp.add(node.val);
                //向队列添加新的元素,留作下次循环使用
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            list.add(tmp);
        }
        return list;
    }
}

3 从上到下打印二叉树Ⅲ

3.1 题目

https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/

3.2 思路

何为双端队列?

双端队列顾名思义就是既可以在队首插入也可以在队尾弹出的队列。

因此如果想要达到题目的要求,就可以先判断是奇数还是偶数,并进行队首插入或队尾插入。

3.3 题解
/**
 * @desc: 剑指 Offer 32 - III. 从上到下打印二叉树 III
 * @author: YanMingXin
 * @create: 2021/9/13-15:08
 **/
public class Test03 {
    /**
     * 声明双端队列
     */
    private Queue<TreeNode> queue = new LinkedList<>();
    /**
     * 嵌套List
     */
    private List<List<Integer>> res = new ArrayList<>();
    /**
     * BFS+双端队列
     *
     * @param root
     * @return
     */
    public List<List<Integer>> levelOrder(TreeNode root) {
        if (root != null) {
            queue.add(root);
        }
        while (!queue.isEmpty()) {
            LinkedList<Integer> tmp = new LinkedList<>();
            for (int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                if (res.size() % 2 == 0) {
                    // 偶数层 -> 队列头部
                    tmp.addLast(node.val);
                } else {
                    // 奇数层 -> 队列尾部
                    tmp.addFirst(node.val);
                }
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            res.add(tmp);
        }
        return res;
    }
}

~

相关文章
|
1月前
|
存储
【剑指offer】- 按之字形顺序打印二叉树-45/67
【剑指offer】- 按之字形顺序打印二叉树-45/67
【剑指offer】-从上往下打印二叉树-22/67
【剑指offer】-从上往下打印二叉树-22/67
|
1月前
|
存储
【剑指offer】-把二叉树打印成多行-43/67
【剑指offer】-把二叉树打印成多行-43/67
|
存储 C语言
力扣 - 102、二叉树的层序遍历(剑指Offer - 面试题32:从上到下打印二叉树)
力扣 - 102、二叉树的层序遍历(剑指Offer - 面试题32:从上到下打印二叉树)
66 1
剑指offer_二叉树---之字形打印二叉树
剑指offer_二叉树---之字形打印二叉树
42 0
剑指offer 33. 之字形打印二叉树
剑指offer 33. 之字形打印二叉树
54 0
《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
|
算法 前端开发 程序员
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️
85 0
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️
|
算法 前端开发 程序员
「LeetCode」剑指Offer-32从上到下打印二叉树 III ⚡️
「LeetCode」剑指Offer-32从上到下打印二叉树 III ⚡️
89 0
「LeetCode」剑指Offer-32从上到下打印二叉树 III ⚡️