LeetCode:102. 二叉树的层序遍历

简介: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

🍎道阻且长,行则将至。🍓


🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123

可以参考👉LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】


一、🌱102. 二叉树的层序遍历

  • 题目描述:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:

树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000

  • 示例

image.png

🌴解题

1.递归法

也就是使用先序遍历,根据对每一层的深度来考虑增加集合元素,原理是很简单的,判断好递归何时结束即可。

  • code
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        int deepth=1;
        List<List<Integer>> ans=new ArrayList<>();//保存输出结果的集合
        if(root==null)
            return ans;
        List<Integer> list=new ArrayList<>();//每一层的临时集合
        visit(root,list,ans,deepth);//开始遍历
        return ans;
    }

    private static void visit(TreeNode node, List<Integer> list,List<List<Integer>> ans, int deepth) {
        if(node!=null) {//当前节点,以及是否可以继续下行
            if (ans.size() >= deepth)
                ans.get(deepth-1).add(node.val);
            else {
                list.add(node.val);
                ans.add(new ArrayList<>(list));
                list.clear();
            }
            //左右子树进递归
            visit(node.left, list,ans, deepth + 1);
            visit(node.right, list, ans, deepth + 1);
        }
    }
}

image.png

2.迭代法

使用一个队列来进行节点进队,仍然是先序遍历。这里使用到两个集合(一个最后的结果,一个是每一层的)和一个队列的数据结构。
可以用语言描述:
1、根节点入队;
2、然后在循环中是每次 判断 队列是否有节点(没有节点了代表遍历结束了)while;
   2.1、计算出队长为 n
   2.2、对队列进行n次出队 for:
      a、取出队的元素—— node
      b、每一层的集合—— add(node值);
      c、如果node有左右子节点:
         左右节点 顺序进队
   2.3、结果的集合—— add(层集合值);
结束

  • code
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> resultList = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();

        if(root == null) {
            return resultList;
        }

        queue.offer(root);

        while(!queue.isEmpty()) {
            int currentLevelSize = queue.size();
            List<Integer> currentLevel = new ArrayList<>();

            for(int i = 0; i < currentLevelSize; i++) {
                TreeNode node = queue.poll();
                currentLevel.add(node.val);

                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
            }
            resultList.add(currentLevel);
        }
        return resultList;
    }
}

image.png


东风夜放花千树,更吹落、星如雨。—— 辛弃疾

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭


附:完整从数组建立树的运行代码

package code;

import java.util.ArrayList;
import java.util.List;


public class c102 {
    public static void main(String[] args) {
        char[] root1 = {3,9,20,5,' ',15,7};
        TreeNode102 root = new TreeNode102();
        creatNode(root, root1, 0);

        List list = Solution102.levelOrder(root);
        for (Object o : list) {
            System.out.print(o);
        }
    }

    public static void creatNode (TreeNode102 p,char[] root1, int i){
        if (i >= root1.length)
            return;
        p.setVal(root1[i]);//父节点

        if (i * 2 + 1 < root1.length) {
            //左子树  *2+1
            if (root1[i * 2 + 1] != ' ') {
                p.left = new TreeNode102();
                creatNode(p.left, root1, i * 2 + 1);
            } else p.left = null;
        }

        if (i * 2 + 2 < root1.length) {
            //右子树  *2+2
            if (root1[i * 2 + 2] != ' ') {
                p.right = new TreeNode102();
                creatNode(p.right, root1, i * 2 + 2);
            } else p.right = null;
        }

    }
}

/**
 * 层序遍历
 */
class Solution102 {
    public static List<List<Integer>> levelOrder(TreeNode102 root) {
        int deepth=1;
        List<List<Integer>> ans=new ArrayList<>();
        if(root==null)
            return ans;
        List<Integer> list=new ArrayList<>();
        visit(root,list,ans,deepth);

        return ans;
    }

    private static void visit(TreeNode102 node, List<Integer> list,List<List<Integer>> ans, int deepth) {
        if(node!=null) {
            if (ans.size() >= deepth)
                ans.get(deepth-1).add(node.val);
            else {
                list.add(node.val);
                ans.add(new ArrayList<>(list));
                list.clear();
            }

            visit(node.left, list,ans, deepth + 1);
            visit(node.right, list, ans, deepth + 1);
        }
    }
}



class TreeNode102 {
    int val;
    code.TreeNode102 left;
    code.TreeNode102 right;

    TreeNode102() {
    }

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

    TreeNode102(int val, code.TreeNode102 right, code.TreeNode102 left) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

    public void setVal(int val) {
        this.val = val;
    }

    public void setLeft(code.TreeNode102 left) {
        this.left = left;
    }

    public void setRight(code.TreeNode102 right) {
        this.right = right;
    }
}
相关文章
|
6月前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
294 14
|
7月前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
179 10
|
7月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
341 10
|
7月前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
160 4
|
7月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
361 9
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
122 0
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
92 0
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
107 0
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
104 0
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
102 0

热门文章

最新文章