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

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

1 从上到下打印二叉树Ⅰ

1.1 题目

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

1.2 思路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rq8Pb1qU-1631589255782)(《剑指offer》之从上到下打印二叉树ⅠⅡⅢ.assets/image-20210913160752095.png)]

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 思路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LRVGL0d9-1631589255785)(《剑指offer》之从上到下打印二叉树ⅠⅡⅢ.assets/image-20210913162228881.png)]

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 思路

何为双端队列?

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nZyBhou3-1631589255787)(《剑指offer》之从上到下打印二叉树ⅠⅡⅢ.assets/image-20210914110216317.png)]

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;
    }
}

~

猜你喜欢

转载自blog.csdn.net/Mr_YanMingXin/article/details/120283609