c++学习 图论1

使用c++来写一个bfs和dfs

class Solution {
public:
    int minDepth(TreeNode* root) {
        // 如果根节点为空,树的最小深度为0
        if (root == nullptr) {
            return 0;
        }
        
        // 创建一个队列,用于BFS
        // 队列中的每个元素是一个pair,包含节点指针和该节点的深度
        queue<pair<TreeNode*, int>> q;
        
        // 将根节点加入队列,深度为1
        q.push({root, 1});
        
        // 当队列不为空时,继续搜索
        while (!q.empty()) {
            // 取出队列的前端元素
            auto [node, depth] = q.front();
            q.pop();
            
            // 如果当前节点是叶子节点(没有子节点),返回其深度
            // 这就是最小深度,因为BFS首先到达的叶子节点一定是最浅的
            if (node->left == nullptr && node->right == nullptr) {
                return depth;
            }
            
            // 如果左子节点存在,将其加入队列,深度加1
            if (node->left) {
                q.push({node->left, depth + 1});
            }
            // 如果右子节点存在,将其加入队列,深度加1
            if (node->right) {
                q.push({node->right, depth + 1});
            }
        }
        
        // 这行代码实际上不会被执行,因为只要根节点不为空,
        // 我们总会在某个时刻返回一个深度
        return 0;
    }
};

BFS 的核心思想是逐层遍历树,所以它能保证首先找到最小宽度的叶子节点。

现在让我们看看DFS(深度优先搜索)的实现:

class Solution {
public:
    int minDepth(TreeNode* root) {
        // 如果根节点为空,深度为0
        if (root == nullptr) {
            return 0;
        }
        
        // 如果是叶子节点(没有子节点),深度为1
        if (root->left == nullptr && root->right == nullptr) {
            return 1;
        }
        
        // 如果左子树为空,只需考虑右子树
        if (root->left == nullptr) {
            return minDepth(root->right) + 1;
        }
        
        // 如果右子树为空,只需考虑左子树
        if (root->right == nullptr) {
            return minDepth(root->left) + 1;
        }
        
        // 如果左右子树都不为空,取两者的较小值
        return min(minDepth(root->left), minDepth(root->right)) + 1;
    }
};

DFS 的核心思想是深入地搜索树的分支。在这个例子中,我们可以使用所有可能的路径才能确定最小宽度。

两种方法的比较:

  1. BFS 通常更适合寻找最短路径,因为它是逐层搜索的。在这个问题中,它能找到第一个叶子节点时就停止,这可能导致比 DFS 更快。
  2. DFS的优势在于空间复杂度,特别是在树非常深但不应宽的情况下。它的空间复杂度与树的高度成正比,而BFS的空间复杂度与树的最大宽度成正比。
  3. 从实现角度来看,BFS 通常需要使用额外的数据结构(如队列),而 DFS 则可以直接使用递归,实现起来可能更简洁。
  4. 在处理非常大的树时,BFS可能会因为需要存储大量节点而费内存,而DFS则不可能遇到这个问题。
相关推荐
leesan快点跑29 分钟前
昇思25天学习打卡营第13天|sea_fish
学习
子龙烜1 小时前
Pandas 学习笔记(四)--CSV文件
笔记·学习·数据分析·pandas·csv·python数据可视化
街 三 仔1 小时前
【LabVIEW学习篇 - 4】:程序结构——条件结构、事件结构、禁用结构
学习·labview
泡芙冰淇淋ya1 小时前
【redis】redis知识点学习目录整理及简介
数据库·redis·学习
Java追光着1 小时前
谷粒商城学习笔记-逆向工程错误记录
笔记·学习·谷粒商城
前端基地1 小时前
昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨
人工智能·python·深度学习·神经网络·学习·机器学习·ai编程
酷酷学!!!2 小时前
C++第二弹 -- C++基础语法下(引用 内联函数 auto关键字 范围for 指针空值)
开发语言·c++
windxgz2 小时前
FFmpeg——视频拼接总结
c++·ffmpeg·音视频
傅沈骁fsx2 小时前
昇思25天学习打卡营第15天|DCGAN生成漫画头像
学习
luckyme_2 小时前
STM32-GPIO学习内容
stm32·嵌入式硬件·学习