从上到下打印二叉树 III

82 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

从上到下打印二叉树 III

题目

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [20,9],
  [15,7]
]

提示:

  1. 节点总数 <= 1000

题目分析

这道题目同样也是考察二叉树的层序遍历,但需要考虑二叉树层的奇偶性,奇数从左到右遍历,偶数从右到左遍历。这里我们考虑使用双端队列来完成,奇数层添加到双端队列的尾部,偶数层添加到双端队列的头部。

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<>();
        if (root != null) {
            queue.add(root);
        }
        while (!queue.isEmpty()) {
            LinkedList<Integer> temp = new LinkedList<>();
            for (int i = queue.size(); i>0; i--) {
                TreeNode treeNode = queue.poll();
                if (result.size()%2 ==0) {
                    temp.addLast(treeNode.val);
                } else {
                    temp.addFirst(treeNode.val);
                }
                if (treeNode.left!=null) {
                    queue.add(treeNode.left);
                }
                if (treeNode.right!=null) {
                    queue.add(treeNode.right);
                }
            }
            result.add(temp);
        }
        return  result;
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉二叉树的层序优先遍历的操作。

其中

                if (result.size()%2 ==0) {
                    temp.addLast(treeNode.val);
                } else {
                    temp.addFirst(treeNode.val);
                }

这段代码就是利用双端队列的特性,奇数从头部插插入,偶数从尾部添加。而我们知道,LinkedList的数据结构就是一个双向链表的数据结构

总结

这篇文章同样也是解决了二叉树的层序遍历,同时利用了LinkedList这个双向链表的数据结构,关于二叉树遍历的题目千奇百怪,五花八门,我们在合适的场景选择合适的数据结构来解决问题才是硬道理。

如果有不当之处,欢迎指正。