算法之二叉树

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

相关推荐
鳄鱼儿1 分钟前
密码算法的OID查阅
算法
lxh011331 分钟前
螺旋数组题解
前端·算法·js
czlczl200209251 小时前
算法:二叉树的公共祖先
算法
小白程序员成长日记2 小时前
2025.11.23 力扣每日一题
算法·leetcode·职场和发展
16_one3 小时前
autoDL安装Open-WebUi+Rag本地知识库问答+Function Calling
人工智能·后端·算法
散峰而望4 小时前
C++数组(三)(算法竞赛)
开发语言·c++·算法·github
q***95224 小时前
SpringMVC 请求参数接收
前端·javascript·算法
初级炼丹师(爱说实话版)5 小时前
多进程与多线程的优缺点及适用场景总结
算法
hetao17338375 小时前
2025-11-25~26 hetao1733837的刷题记录
c++·算法
历程里程碑5 小时前
各种排序法大全
c语言·数据结构·笔记·算法·排序算法