• 102. 二叉树的层序遍历


    1、题目描述

    2、题目分析 【该题是非常经典的题目!】

    可参考之前分析文章:二叉树的层序遍历(从上到下,从下到上,之字/锯齿/蛇形)

    遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有节点,使每一个节点都被访问一次,而且只被访问一次。

    最基本的是树的结构体(根,左子树,右子树)

    1. //树的结构体
    2. class TreeNode{
    3. int val;
    4. TreeNode left;
    5. TreeNode right;
    6. TreeNode(int val){
    7. this.val = val;
    8. }
    9. TreeNode(int val, TreeNode left, TreeNode right){
    10. this.val = val;
    11. this.left = left;
    12. this.right = right;
    13. }
    14. }

    【层序遍历】方法一:

    DFS-递归解题思路

    代码分析:

    1、如果深度为res的长度,则开启新的一层用于记录(这一行比较难理解)

    1. //此时深度为res的长度,开启新的ArrayList<Integer>用于记录这一层
    2. if(depth == res.size()){
    3. res.add(new ArrayList<Integer>());
    4. }

    2、在当前list行进行元素追加

    res.get(depth).add(node.val);

     3、完整代码如下:

    1. class Solution {
    2. List<List<Integer>> res = new ArrayList<List<Integer>>();
    3. public List<List<Integer>> levelOrder(TreeNode root) {
    4. dfs(root,0);
    5. return res;
    6. }
    7. private void dfs(TreeNode node ,int depth){
    8. if(node == null) return;
    9. //此时深度为res的长度,开启新的ArrayList<Integer>用于记录这一层
    10. if(depth == res.size()){
    11. res.add(new ArrayList<Integer>());
    12. }
    13. res.get(depth).add(node.val);
    14. if(node.left != null) dfs(node.left, depth+1);
    15. if(node.right != null) dfs(node.right, depth+1);
    16. }
    17. }

    复杂度分析

    时间复杂度:O(N),  N代表树节点的个数,树每个节点都会遍历到。
    空间复杂度:O(h),h 是树的高度

    【层序遍历】方法二:

    BFS-广度优先解题思路(这道题是非常经典的题目,必须两个方法都掌握)

    使用容器进行迭代遍历,BFS使用的是【队列】。

    1. class Solution {
    2. public List<List<Integer>> levelOrder(TreeNode root) {
    3. List<List<Integer>> res = new ArrayList<List<Integer>>();
    4. if(root == null) return res;
    5. //使用容器进行遍历,BFS使用的是【队列】
    6. Queue<TreeNode> queue = new LinkedList<TreeNode>();
    7. queue.offer(root);
    8. while(!queue.isEmpty()){
    9. List<Integer> line = new ArrayList<Integer>();
    10. int lineCount = queue.size();
    11. while(lineCount > 0){
    12. TreeNode node = queue.poll();
    13. line.add(node.val);
    14. lineCount--;
    15. //判定TreeNode的左右子树是否为null, 不为空也压入队列
    16. if(node.left != null)
    17. queue.offer(node.left);
    18. if(node.right != null)
    19. queue.offer(node.right);
    20. }
    21. res.add(line);
    22. }
    23. return res;
    24. }
    25. }

    复杂度分析

    记树上所有节点的个数为 n。

    时间复杂度:O(n),每个点进队出队各一次,故渐进时间复杂度为 O(n)。
    空间复杂度:O(n),队列中元素的个数不超过 n 个,故渐进空间复杂度为 O(n)。

  • 相关阅读:
    TRC 链格孢菌毒素和基因毒素丨艾美捷 TRC Alternariol 9-龙胆二糖苷
    MATLAB | 19a到22a之间都更新了哪些绘图新特性?
    代理IP与Socks5代理在网络安全与数据隐私中的关键作用
    java swing实现抖音上的表白程序
    UVa11595 Crossing Streets EXTREME
    C基础学习之C 函数指针
    wps批量删除空白单元格
    leetcode上做的题,怎么报错了
    精讲java中的CAS
    从源码角度看Flink从上游获取数据、处理数据并发往下游算子的过程关键StreamInputProcessor
  • 原文地址:https://blog.csdn.net/huihuiaiyangyang/article/details/125533881