算法之二叉树

102. 二叉树的层序遍历 - 力扣(LeetCode)

一 DFS和BFS

1.1 DFS

cpp 复制代码
#include <iostream>

// 二叉树节点的定义
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) {}
};

// DFS遍历函数(后序遍历:先左子树,再右子树)
void dfs(TreeNode* root) {
    if (root == nullptr) {  // 若节点为空,直接返回
        return;
    }
    dfs(root->left);        // 递归遍历左子树
    dfs(root->right);       // 递归遍历右子树
    // 此处可添加对当前节点的处理逻辑,如:
    // std::cout << root->val << " ";
}

1.2 BFS

cpp 复制代码
// BFS遍历函数(层序遍历)
void bfs(TreeNode* root) {
    if (root == nullptr) {  // 处理空树情况
        return;
    }
    
    std::queue<TreeNode*> queue;  // C++中使用std::queue,存储节点指针
    queue.push(root);             // 将根节点入队
    
    while (!queue.empty()) {      // 队列不为空时循环
        TreeNode* node = queue.front();  // 获取队首元素(C++的front()对应Java的peek())
        queue.pop();                     // 移除队首元素(C++的pop()仅移除不返回,对应Java的poll())
        
        // 处理当前节点(根据需求添加逻辑,如打印节点值)
        // std::cout << node->val << " ";
        
        // 左子节点不为空则入队
        if (node->left != nullptr) {
            queue.push(node->left);
        }
        // 右子节点不为空则入队
        if (node->right != nullptr) {
            queue.push(node->right);
        }
    }
}

二 二叉树层序遍历

cpp 复制代码
class Solution {
public:
  std::vector<std::vector<int>> levelOrder(TreeNode* root) {
    std::vector<std::vector<int>> res;  // 存储最终结果
    
    if (root == nullptr) {  // 空树直接返回空结果
        return res;
    }
    
    std::queue<TreeNode*> q;  // 队列用于存储待处理的节点
    q.push(root);             // 根节点入队
    
    while (!q.empty()) {
        int n = q.size();  // 当前层的节点数量
        std::vector<int> level;  // 存储当前层的节点值
        
        // 处理当前层的所有节点
        for (int i = 0; i < n; ++i) {
            TreeNode* node = q.front();  // 获取队首节点
            q.pop();                     // 移除队首节点
            
            level.push_back(node->val);  // 将当前节点值加入当前层
            
            // 左子节点不为空则入队
            if (node->left != nullptr) {
                q.push(node->left);
            }
            // 右子节点不为空则入队
            if (node->right != nullptr) {
                q.push(node->right);
            }
        }
        
        res.push_back(level);  // 将当前层加入结果集
    }
    
    return res;
}
};

【1】将当前层的node全部弹出,q.front()

【2】res是vector<vetor<int>>,每一层用一个vector<int>装

相关推荐
汽车仪器仪表相关领域17 分钟前
全自动化精准检测,赋能高效年检——NHD-6108全自动远、近光检测仪项目实战分享
大数据·人工智能·功能测试·算法·安全·自动化·压力测试
Doro再努力1 小时前
【数据结构08】队列实现及练习
数据结构·算法
清铎2 小时前
leetcode_day12_滑动窗口_《绝境求生》
python·算法·leetcode·动态规划
linweidong2 小时前
嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
stm32·单片机·算法
net3m332 小时前
单片机屏幕多级菜单系统之当前屏幕号+屏幕菜单当前深度 机制
c语言·c++·算法
mmz12073 小时前
二分查找(c++)
开发语言·c++·算法
Insight3 小时前
拒绝手动 Copy!一文吃透 PyTorch/NumPy 中的广播机制 (Broadcasting)
算法
CoovallyAIHub3 小时前
工业视觉检测:多模态大模型的诱惑
深度学习·算法·计算机视觉
Jayden_Ruan3 小时前
C++分解质因数
数据结构·c++·算法
bubiyoushang8884 小时前
MATLAB实现雷达恒虚警检测
数据结构·算法·matlab