【leetcode】DFS递归题目总结

DFS(深度优先搜索) 深度优先搜索是一种用于遍历搜索树或图的算法,其基本思路是从起始节点开始,沿着一条路径一直走到底,直到无法再走下去为止,然后回溯到上一个节点,继续走到另外一个路径,重复上述过程,直到遍历完所有节点。 

dfs框架:

void dfs(int cur, vector<int>& visited, vector<vector<int>>& graph) {visited[cur] = 1; // 标记当前节点已经被访问// 处理当前节点curfor (int i = 0; i < graph[cur].size(); i++) {int next = graph[cur][i];if (!visited[next]) { // 如果下一个节点未被访问dfs(next, visited, graph); // 继续访问下一个节点}}
}
void dfsTraversal(vector<vector<int>>& graph) {int n = graph.size();vector<int> visited(n, 0); // 初始化访问数组for (int i = 0; i < n; i++) {if (!visited[i]) { // 如果当前节点未被访问dfs(i, visited, graph); // 从当前节点开始进行深度优先遍历}}
}

94. 二叉树的中序遍历

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:vector<int> res;void traversal(TreeNode* root) {if (root == nullptr) return;traversal(root->left);res.push_back(root->val);traversal(root->right);}vector<int> inorderTraversal(TreeNode* root) {traversal(root);return res;}
};

104. 二叉树的最大深度

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {if (root == nullptr) return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};

226. 翻转二叉树

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:void travsal(TreeNode* root) {if (root == nullptr) return;TreeNode* temp = root->right;root->right = root->left;root->left = temp;travsal(root->left);travsal(root->right);}TreeNode* invertTree(TreeNode* root) {travsal(root);return root;}
};

101. 对称二叉树

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:bool dfs(TreeNode* left, TreeNode* right) {if (left == nullptr && right == nullptr) {return true;}if (left == nullptr || right == nullptr) {return false;}if (left->val != right->val) {return false;}return dfs(left->left, right->right) && dfs(left->right, right->left);}bool isSymmetric(TreeNode* root) {return dfs(root, root);}
};

543. 二叉树的直径

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:int resDiameter = 0;int maxDepth(TreeNode* root) {if (root == nullptr) return 0;int maxLeft = maxDepth(root->left);int maxRight = maxDepth(root->right);int curDiameter = maxLeft + maxRight;resDiameter = max(curDiameter, resDiameter);return max(maxLeft, maxRight) + 1;}int diameterOfBinaryTree(TreeNode* root) {maxDepth(root);return resDiameter;}
};

200. 岛屿数量

class Solution {
public:void dfs(vector<vector<char>>& grid, int i, int j) {int m = grid.size();int n = grid[0].size(); if (i < 0 || j < 0 || i >= m || j >= n) {return;}if (grid[i][j] == '0') {return;}if (grid[i][j] == '1') {grid[i][j] = '0';dfs(grid, i, j - 1);dfs(grid, i, j + 1);dfs(grid, i - 1, j);dfs(grid, i + 1, j);}}int numIslands(vector<vector<char>>& grid) {int m = grid.size();int n = grid[0].size(); int res = 0;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == '1') {res += 1;dfs(grid, i, j);} }}return res;}
};

LCR 054. 把二叉搜索树转换为累加树

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:int sum = 0;void travesal(TreeNode* root) {if (root == nullptr) return;travesal(root->right);sum += root->val;root->val = sum;travesal(root->left);}TreeNode* convertBST(TreeNode* root) {travesal(root);return root;}
};

98. 验证二叉搜索树

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:bool myIsValidBST(TreeNode* root, long long min, long long max) {if (root == nullptr) return true;if (root->val <= min || root->val >= max) return false;return myIsValidBST(root->left, min, root->val) && myIsValidBST(root->right, root->val, max);}bool isValidBST(TreeNode* root) {return myIsValidBST(root, LLONG_MIN, LLONG_MAX);}
};

700. 二叉搜索树中的搜索

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if (root == nullptr) return nullptr;if (root->val == val) return root;return root->val > val ? searchBST(root->left, val) : searchBST(root->right, val);}
};

199. 二叉树的右视图

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:vector<int> res;void dfs(TreeNode* root, int depth) {if (root == nullptr) return;if (depth == res.size()) {res.push_back(root->val);}depth++;dfs(root->right, depth);dfs(root->left, depth);}vector<int> rightSideView(TreeNode* root) {dfs(root, 0);return res;}
};

236. 二叉树的最近公共祖先

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root) return NULL;if (root == p) return p;if (root == q) return q;TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);if (left && right) return root;return left ? left : right; }
};

111. 二叉树的最小深度

class Solution {
public:int minDepth(TreeNode *root) {if (root == nullptr) {return 0;}if (root->left == nullptr && root->right == nullptr) {return 1;}int min_depth = INT_MAX;if (root->left != nullptr) {min_depth = min(minDepth(root->left), min_depth);}if (root->right != nullptr) {min_depth = min(minDepth(root->right), min_depth);}return min_depth + 1;}
};

104. 二叉树的最大深度

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {if (root == nullptr) return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};

124. 二叉树中的最大路径和

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:int maxSum = INT_MIN;int maxGain(TreeNode* root) {if (root == nullptr) return 0;int left = max(maxGain(root->left), 0);int right = max(maxGain(root->right), 0);int cur = root->val + left + right;maxSum = max(cur, maxSum);return root->val + max(left, right);}int maxPathSum(TreeNode* root) {maxGain(root);return maxSum;}
};

230. 二叉搜索树中第K小的元素

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:int index = 0;int res = 0;void travesal(TreeNode* root, int k) {if (root == nullptr) return;travesal(root->left, k);if (++index == k) {res = root->val;return;}travesal(root->right, k);}int kthSmallest(TreeNode* root, int k) {travesal(root, k);return res;}
};

652. 寻找重复的子树

/*** Definition for a binary tree node.* 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) {}* };*/
class Solution {
public:unordered_map<string, int> seen;vector<TreeNode*> res;string travesal(TreeNode* root) {if (root == nullptr) return "#";string left = travesal(root->left);string right = travesal(root->right);string subTree = left + "," + right + "," + to_string(root->val);auto it = seen.find(subTree);if (it != seen.end() && it->second == 1) {res.push_back(root);}seen[subTree]++;return subTree;}vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {travesal(root);return res;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/6620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二代增强-创建采购申请时的增强

文章目录 第二代增强-创建采购申请时的增强业务要求实现过程创建项目编写代码激活增强 维护消息类运行效果断点 第二代增强-创建采购申请时的增强 业务要求 实现过程 创建项目 编写代码 "AFNAM&#xff0c;申请人 "需求&#xff1a;NB类型的采购申请&#xff0c;需要…

嵌入式全栈开发学习笔记---C语言笔试复习大全10

目录 字符数组&#xff08;笔试重点&#xff09; 字符数组初始化 字符串数组输出 字符串的输入 字符串处理函数 puts()输出字符串 gets()输入字符串 strlen()计算字符串长度 strcpy()将后面的字符串拷贝到前面的字符串数组里面 笔试题12 strcmp()比较字符串的大小 …

自动化机器学习——网格搜索法:寻找最佳超参数组合

自动化机器学习——网格搜索法&#xff1a;寻找最佳超参数组合 在机器学习中&#xff0c;选择合适的超参数是模型调优的关键步骤之一。然而&#xff0c;由于超参数的组合空间通常非常庞大&#xff0c;手动调整超参数往往是一项耗时且困难的任务。为了解决这个问题&#xff0c;…

大模型引领NLP研究新范式:从统计机器学习到预训练语言模型

自然语言处理&#xff08;NLP&#xff09;研究范式经历了从浅层到深层、从局部到整体、从特定到通用的演进过程。下面我们来详细回顾这一过程。 一、早期的统计机器学习方法&#xff08;20世纪90年代 - 21世纪初&#xff09; 词袋模型&#xff08;Bag-of-Words&#xff09; 将…

C语言 | Leetcode C语言题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; void reserve(char* s) {int len strlen(s);for (int i 0; i < len / 2; i) {char t s[i];s[i] s[len - i - 1], s[len - i - 1] t;} }char* addBinary(char* a, char* b) {reserve(a);reserve(b);int len_a strlen(a), len_b st…

性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

大厂案例 - 通用的三方接口调用方案设计(中)

文章目录 Pre阿里云华为云【AK和SK生成方案】最佳实践1. 创建API密钥管理系统2. 生成AK和SK3. 存储和管理AK和SK4. 提供API密钥分发机制5. 安全性6. 其他注意事项 DB Model Design表结构Next考虑其他建议 API接口设计指导1. 使用POST作为接口请求方式2. 客户端IP白名单3. 单个接…

【研发管理】产品经理知识体系-产品创新流程

导读&#xff1a;产品创新流程是一个系统性的过程&#xff0c;旨在通过创造和引入新的产品或改进现有产品来满足市场需求、解决用户问题或实现竞争优势。 目录 1、产品创新引论 2、决策基本框架 3、模糊前端 4、产品创新流程模型概论 5、门径管理流程 6、并行工程和集成产…

深度学习技术在运动想象脑电信号中分类中的学习实战

----&#xff08;本文由思影科技学习参考后得出&#xff09; 脑机接口&#xff08;BCI&#xff09;中运动想象脑电图&#xff08;MI-EEG&#xff09;是最常见的BCI范式之一&#xff0c;已经广泛应用于只能医疗&#xff0c;如中风后康复和移动辅助机器人。近年来&#…

Java与Go:并发

在此之前&#xff0c;我们先要明白什么是并发&#xff1f;为什么要并发编程&#xff1f; 在计算机中&#xff0c;同一时刻&#xff0c;只能有一条指令&#xff0c;在一个CPU上执行 后面的指令必须等到前面指令执行完才能执行&#xff0c;就是串行。在早年CPU核心数还少的时候倒…

Android版本依赖Version catalog

曾经我们使用config.gradle文件进行版本依赖配置&#xff0c;然后在project的build.gradle.kts中使用如下方式引入&#xff1a; apply(from "./config.gradle") 缺点&#xff1a;在project的module中引用无任何提示&#xff0c;无法跳转到指定引用 一、创建versio…

临床+康复的一体化治疗服务,把握黄金康复时间

随着我院脑血管病人&#xff0c;重症病人及骨科病人康复需求的日渐增多&#xff0c;为了使每位住院患者在治疗原发病的同时&#xff0c;第一时间接受到康复治疗&#xff0c;提高病人的生活质量&#xff0c;降低致残率&#xff0c;我院康复治疗科在院领导的大力支持下&#xff0…

C语言之递归函数、例题详解以及注意事项

目录 前言 一、递归的概念 二、递归例题详解 例1&#xff1a;斐波那契数列 例2&#xff1a;求次方 例3&#xff1a;求各位数之和 例4&#xff1a;阶乘 例5&#xff1a;顺序打印 三、递归的注意事项 总结 前言 本文将和大家分享一些递归函数的相关知识&#xff0c;技巧…

EPAI手绘建模APP颜色、贴图、材质、样式

⑦ 颜色选择页面 1) 颜色环选色。 图 65 颜色选择器-颜色环 2) RGB选色。 图 66 颜色选择器-RGB 3) HSL选色。 图 67 颜色选择器-HSL 4) 国风颜色库选色。 图 68 颜色选择器-国风 5) CSS颜色库选色。 图 69 颜色选择器-CSS 6) 历史颜色&#xff1a;保存最近使用的多个颜色&…

【C++语言】封装

当谈及面向对象编程&#xff08;OOP&#xff09;中的三个主要概念——封装、继承和多态时&#xff0c;封装是最基础和最重要的。封装是将数据和操作数据的函数捆绑在一起的概念。在C中&#xff0c;封装通过类来实现&#xff0c;类将数据成员和成员函数封装在一起。本文将详细讨…

Gunicorn与Nginx协同工作:配置Django应用的高效指南

Gunicorn和Nginx是常用的部署Django应用的组合。Gunicorn是一个Python Web服务器&#xff0c;用于运行Django应用程序的Web服务器。Nginx是一个高性能的反向代理服务器&#xff0c;常用于前端的负载均衡和静态文件服务。 下面是配置Django应用的高效指南&#xff1a; 安装Guni…

vue快速入门(五十三)使用js进行路由跳转

注释很详细&#xff0c;直接上代码 上一篇 新增内容 几种常用的路由跳转方式演示 源码 App.vue <template><div id"app"><div class"nav"><!-- router-link 自带两个高亮样式类 router-link-exact-active和router-link-active区别&a…

microk8s的registry私有镜像库

一、正常步骤 打开registry microk8s enable registry给docker里边的镜像重新打标签 标签格式是 localhost:32000/image:tag docker tag image:tag localhost:32000/image:tag上传镜像 docker push localhost:32000/image:tag在Deployment中使用它 注意下面镜像名称&#xff1…

3.SpringSecurity基本原理

SpringSecurity本质是一个过滤器链。十多个过滤器构成一个过滤器链。 这些过滤器在项目启动就会进行加载。每个过滤器执行放行操作才会执行下一个过滤器。 常见过滤器 FilterSecurityInterceptor 是一个方法级的权限过滤器&#xff0c;基本位于过滤器链的最底部。 Excepti…

Rust web简单实战

一、使用async搭建简单的web服务 1、修改cargo.toml文件添加依赖 [dependencies] futures "0.3" tokio { version "1", features ["full"] } [dependencies.async-std] version "1.6" features ["attributes"]2、搭…