算法之二叉树

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>装

相关推荐
max5006006 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
王哥儿聊AI7 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
手握风云-9 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法9 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董9 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone9 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法
杨小码不BUG10 小时前
CSP-J/S初赛知识点精讲-图论
c++·算法·图论··编码·csp-j/s初赛
LeaderSheepH11 小时前
常见的排序算法
数据结构·算法·排序算法
周杰伦_Jay12 小时前
【图文详解】强化学习核心框架、数学基础、分类、应用场景
人工智能·科技·算法·机器学习·计算机视觉·分类·数据挖掘
violet-lz12 小时前
Linux静态库与共享库(动态库)全面详解:从创建到应用
算法