首页 > 其他分享 >【BFS】LeetCode 103. 二叉树的锯齿形层序遍历

【BFS】LeetCode 103. 二叉树的锯齿形层序遍历

时间:2023-01-11 16:13:50浏览次数:64  
标签:node queue 层序 BFS add 二叉树 new null result

题目链接

103. 二叉树的锯齿形层序遍历

思路1

额外加一个栈来使得访问节点的顺序是逆序的

代码1

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        if(root == null){
            return new ArrayList<List<Integer>>();
        }

        List<List<Integer>> result = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        Queue<TreeNode> queue = new ConcurrentLinkedDeque<>();

        stack.add(root);
        int layer = 0;
        while(!stack.isEmpty()){
            int numOfNodes = stack.size();
            layer++;
            List<Integer> temp = new ArrayList<>();

            for(int i = 0; i < numOfNodes; i++){
                TreeNode node = stack.pop();
                temp.add(node.val);
                if(layer % 2 == 1){
                    if(node.left != null){
                        queue.add(node.left);
                    }
                    if(node.right != null){
                        queue.add(node.right);
                    }
                }else{
                    if(node.right != null){
                        queue.add(node.right);
                    }
                    if(node.left != null){
                        queue.add(node.left);
                    }
                }
            }

            stack.addAll(queue);
            queue.clear();
            result.add(temp);
        }

        return result;
    }
}

思路2

访问结点的顺序不改变,仅改变放入列表的顺序

代码2

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if(root == null) {
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<>();

        queue.add(root);
        //第一步先从左边开始打印
        boolean leftToRight = true;
        while(!queue.isEmpty()) {
            int count = queue.size();
            List<Integer> level = new ArrayList<>();

            for(int i = 0; i < count; i++) {
                TreeNode node = queue.poll();
                if(leftToRight) {
                    level.add(node.val);
                } else {
                    //如果是从右边开始打印,每次要把访问的节点值加入到列表的最前面
                    level.add(0, node.val);
                }
                //左右子节点如果不为空会被加入到队列中
                if(node.left != null) {
                    queue.add(node.left);
                }
                if(node.right != null) {
                    queue.add(node.right);
                }
            }

            result.add(level);
            leftToRight = !leftToRight;
        }
        return result;
    }
}

标签:node,queue,层序,BFS,add,二叉树,new,null,result
From: https://www.cnblogs.com/shixuanliu/p/17044074.html

相关文章

  • 输出二叉树的右视图
    题目要求题目链接思路分析方法一:刚开始做的时候没有什么思路,就采用了最笨的方法根据中序和先序求出二叉树得到层序遍历的结果得到每一层的最后一个元素方法比较笨......
  • 543. 二叉树的直径
    题目给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。注意:两结点之间的路径长度......
  • 算法刷题 Day 14 | 二叉树的递归遍历
    今日内容:理论基础递归遍历迭代遍历统一迭代详细布置理论基础需要了解二叉树的种类,存储方式,遍历方式以及二叉树的定义文章讲解:https://programm......
  • 重建二叉树
    题目描述思路分析在中序遍历列表中找到先序遍历列表中第一个节点,以此为界限可以将二叉树分为左右子树,可以得知左子树和右子树的长度,在先序遍历列表中划分出来。再依次拿......
  • 二叉树
    1.二叉树的概念二叉树是n个有限元素的集合,该集合或为空、或由一个根节点及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为......
  • 代码随想录day14 LeetCode 144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中
    144.二叉树的前序遍历classSolution{public:vector<int>v;vector<int>preorderTraversal(TreeNode*root){if(root==NULL)returnv;......
  • 力扣102 二叉树的层序遍历(广度优先搜索)
    题目:给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]思......
  • 力扣226 翻转二叉树
    题目:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1] ......
  • 判断是不是平衡二叉树
    题目描述输入一棵节点数为n二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(BalancedBinaryTree),具有以......
  • 判断是不是完全二叉树
    题目要求给定一个二叉树,确定他是否是一个完全二叉树。完全二叉树的定义:若二叉树的深度为h,除第h层外,其它各层的结点数都达到最大个数,第h层所有的叶子结点都连续集中......