算法之二叉树

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

相关推荐
我搞slam8 分钟前
快乐数--leetcode
算法·leetcode·哈希算法
WWZZ202541 分钟前
快速上手大模型:机器学习3(多元线性回归及梯度、向量化、正规方程)
人工智能·算法·机器学习·机器人·slam·具身感知
东方佑2 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
西阳未落2 小时前
LeetCode——二分(进阶)
算法·leetcode·职场和发展
通信小呆呆2 小时前
以矩阵视角统一理解:外积、Kronecker 积与 Khatri–Rao 积(含MATLAB可视化)
线性代数·算法·matlab·矩阵·信号处理
CoderCodingNo3 小时前
【GESP】C++四级真题 luogu-B4068 [GESP202412 四级] Recamán
开发语言·c++·算法
一个不知名程序员www3 小时前
算法学习入门---双指针(C++)
c++·算法
Shilong Wang4 小时前
MLE, MAP, Full Bayes
人工智能·算法·机器学习
Theodore_10224 小时前
机器学习(6)特征工程与多项式回归
深度学习·算法·机器学习·数据分析·多项式回归
知花实央l4 小时前
【算法与数据结构】拓扑排序实战(栈+邻接表+环判断,附可运行代码)
数据结构·算法