当前位置: 首页 > article >正文

【LeetCode】102. 二叉树的层序遍历

题目链接


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Python3

方法一: 广度优先搜索 (BFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup O(n)⟯

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        res = []
        queue =   [root,] 
        while queue: 
            tmp = [node.val for node in queue]
            res.append(tmp) # 取当前层 的结点值

            lis = [] ## 下一层 的结点
            for node in queue:
                if node.left:
                    lis.append(node.left)
                if node.right:
                    lis.append(node.right)

            queue = lis 

        return res

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        ans = []
        dq = deque([root])
        while dq: 
            level = [] ## 当前 遍历层
            n = len(dq)
            for _ in range(n):
                cur = dq.popleft()
                level.append(cur.val)
                # 下一层 存到  双端 队列 后面
                if cur.left:
                    dq.append(cur.left)
                if cur.right:
                    dq.append(cur.right)

            ans.append(level)

        return ans

在这里插入图片描述

方法二: 深度优先搜索 (DFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup O(n)⟯

参考链接

DFS 做本题的主要问题是: DFS 不是按照层次遍历的。为了让递归的过程中同一层的节点放到同一个列表中,在递归时要记录每个节点的深度。递归到新节点要把该节点 对应深度列表的末尾。

在这里插入图片描述

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        # 子模块
        def helper(node, depth):
            # 记住结点的 深度
            if not node: return 
            if len(res) == depth:
                res.append([])
            res[depth].append(node.val)
            if node.left: helper(node.left, depth+1)
            if node.right: helper(node.right, depth+1)

        # 主模块
        if not root: return []
        res = []
        helper(root, 0)
        return res 

C++

方法一: 广度优先搜索 (BFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup O(n)⟯

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if (root == nullptr){
            return res;
        }

        queue <TreeNode*> q;
        q.emplace(root);
        while (!q.empty()){
            int n = q.size();
            res.emplace_back(vector<int> ());// 提前添加 空容器
            for (int i = 0; i < n; ++i){
                auto node = q.front(); q.pop();
                res.back().emplace_back(node->val);
                if (node->left){
                    q.emplace(node->left);
                }
                if (node->right){
                    q.emplace(node->right);
                }
            }

        }
        return res;
    }
};

http://www.kler.cn/a/106015.html

相关文章:

  • Linux守护Pythom脚本运行——Supervisor学习总结
  • 安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机
  • 基于Python的仓库管理系统设计与实现
  • 笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像
  • JavaScript中的reduce函数
  • pycharm分支提交操作
  • 51.MongoDB聚合操作与索引使用详解
  • 为什么选择Codigger静态分析?
  • 【uniapp】小程序开发7:自定义组件、自动注册组件
  • 【FPGA零基础学习之旅#17】搭建串口收发与储存双口RAM系统
  • 嵌入式MCU学习利器-03-在线做RT-Thread实验
  • SDRAM学习笔记(MT48LC16M16A2,w9812g6kh)
  • MATLAB——一维离散小波的单层分解
  • Python 深度学习入门之CNN
  • 【详细】Java网络通信 TCP、UDP、InetAddress
  • 【人工智能专栏】(3)知识表示方法 II
  • 什么是云原生?土生土长?
  • hive窗口函数记录
  • 如何开通 Medium会员
  • Camera2开发基础知识篇——手机影像参数
  • 四、W5100S/W5500+RP2040树莓派Pico<TCP Server数据回环测试>
  • idea 中配置 maven
  • 华为OD机考算法题:计算最大乘积
  • ED8000 地下电子标签探测器|标识器探测仪深度测量校准操作说明
  • 如何在Pacman (Arch Linux)中用Configuration设置HTTP?
  • 取证之2021年第三届长安杯电子数据取证竞赛