算法之二叉树

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

相关推荐
董董灿是个攻城狮5 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员12 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish12 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱13 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript