当前位置: 首页 > news >正文

dfs|bfs建图

lc1001

discussion发现的圣经

反复诵读TvT

"每个变量、每个逻辑分支对内完成的是什么功能、对外在整体程序中扮演的角色是什么"

"对待游戏一样享受这个过程"

lc2385

dfs不建图

利用负数,一次遍历

class Solution {
int ans = 0, start;

int dfs(TreeNode* node) {
if (node == nullptr) {
return 0;
}
int l_len = dfs(node->left);
int r_len = dfs(node->right);
if (node->val == start) {
// 计算子树 start 的最大深度
ans = -min(l_len, r_len); // 负负得正
return 1; // 用正数表示找到了 start
}
if (l_len > 0 || r_len > 0) {
// 只有在左子树或右子树包含 start 时,才能更新答案
ans = max(ans, abs(l_len) + abs(r_len)); // 两条链拼成直径
return max(l_len, r_len) + 1; // max 会自动取到正数
}
return min(l_len, r_len) - 1; // 用负数表示没有找到 start
}

public:
int amountOfTime(TreeNode* root, int start) {
this->start = start;
dfs(root);
return ans;
}
};

bfs建图

一次bfs建表

一次bfs找最远层数

class Solution {
public:
int amountOfTime(TreeNode* root, int start) {
unordered_map<TreeNode*, TreeNode*> p;
TreeNode* s = nullptr;
queue<TreeNode*> q;
q.push(root);
p[root] = nullptr;
while (!q.empty()) {
auto t = q.front();
q.pop();
if (t->val == start) s = t;
if (t->left) {
p[t->left] = t;
q.push(t->left);
}
if (t->right) {
p[t->right] = t;
q.push(t->right);
}
}

unordered_map<TreeNode*, bool> v;
q.push(s);
v[s] = true;
int res = -1;
while (!q.empty()) {
int sz = q.size();
res++;
while (sz--) {
auto t = q.front();
q.pop();
if (t->left && !v[t->left]) {
v[t->left] = true;
q.push(t->left);
}
if (t->right && !v[t->right]) {
v[t->right] = true;
q.push(t->right);
}
if (p[t] && !v[p[t]]) {
v[p[t]] = true;
q.push(p[t]);
}
}
}
return res;
}
};

dfs建图+bfs

class Solution {
public:
int amountOfTime(TreeNode* root, int start) {
unordered_map<int, vector<int>> g;
function<void(TreeNode*)> dfs = [&] (TreeNode *root) {
if (root == nullptr || root->left == root->right)
return;


if (root->left) {
int u = root->val, v = root->left->val;
g[u].emplace_back(v);
g[v].emplace_back(u);
}

if (root->right) {
int u = root->val, v = root->right->val;
g[u].emplace_back(v);
g[v].emplace_back(u);
}

dfs(root->left);
dfs(root->right);
};
dfs(root);

int time = -1;
queue<int> q;
q.push(start);
unordered_set<int> visited{start};
while (!q.empty()) {
time++;
int len = q.size();
while (len--) {
int cur = q.front();
q.pop();
for (int nei : g[cur]) {
if (visited.find(nei) != visited.end()) {
continue;
}
q.push(nei);
visited.insert(nei);
}
}
}
return time;
}
};

http://www.jsqmd.com/news/244720/

相关文章:

  • 如何在3分钟内为Windows 11 LTSC系统安装微软商店:完整指南
  • 终极指南:用Topit窗口置顶彻底改变你的Mac工作流
  • FFXIV辍学插件终极指南:3步快速跳过烦人动画
  • 说说你对内部类的理解
  • Strings与newString有什么区别
  • Make与Makefile概述
  • 程序构建系统概述
  • DDoS攻击详解_ddos攻击流程,零基础入门到精通,收藏这篇就够了
  • 小红书无水印下载高效完整指南:零基础一键操作全攻略
  • python基于flask框架 仓库库存管理系统设计与实现
  • 一篇关于内网渗透基础的知识分享(非常详细)从零基础到精通,收藏这篇就够了!
  • python基于flask框架 农产品销售供应商管理系统
  • 【C++入门】Cyber骇客的同名异梦——【C++重载函数】(与C的函数差异)
  • 基于西门子 PLC S7 - 1200 系列的立体车库设计之旅
  • 【漏洞挖掘】小白是如何挖漏洞的(技巧篇)入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
  • ESP32C3串口下载关键引脚及触发方法
  • 功率电路IGBT吸收电容原理,吸收电容选型
  • 三甲医院如何实现业务“零中断”?基于zData X一体机的数据库灾备体系实践分享
  • 如何粘贴为纯文本?WORD如何粘贴为纯文本?如何把“CTRL+SHIFT+V”改为“粘贴为纯文本”
  • 泰裤辣!NGS数据过滤:从“大怨种”到“高质量数据”
  • 零翔出玩组局陪玩系统:技术架构与功能创新引领社交旅游新风尚
  • 2026 年,还有必要做程序员兼职吗?我把常见平台都试了一遍
  • 腾讯 CodeBuddy AIIDE 来了!不写一句代码就能搞定产品设计研发、数据库、部署!
  • 非线性悬架,UKF状态估计 软件使用:Matlab/Simulink 适用场景:采用模块化建模...
  • 江大新财务系统介绍
  • 点云转mesh
  • [Windows] 正牌STEAM小黄鸭(给游戏,视频帧数翻倍更丝滑) Lossless Scaling 3.2.2 免安装版
  • 云晨科技模版项目介绍说明
  • 【开题答辩全过程】以 养老服务微信小程序为例,包含答辩的问题和答案
  • 汽车动力学模型探究:线性二自由度、Carsim与运动学模型