news 2026/4/18 11:02:28

dfs|bfs建图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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;
}
};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:00:26

小红书无水印下载高效完整指南:零基础一键操作全攻略

小红书无水印下载高效完整指南&#xff1a;零基础一键操作全攻略 【免费下载链接】XHS-Downloader 免费&#xff1b;轻量&#xff1b;开源&#xff0c;基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloader …

作者头像 李华
网站建设 2026/4/18 2:49:35

【漏洞挖掘】小白是如何挖漏洞的(技巧篇)入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

目录&#xff1a; 怎么找漏洞 找到后如何挖漏洞 关于通杀漏洞N day漏洞的挖掘 漏洞如何提交 每小结都有提供对应的案例&#xff0c;简直不要太nice&#xff01; 这个月的SRC活动也快开始了&#xff0c;看到群里的小伙伴在问如何找漏洞&#xff0c;SQL注入的漏洞咋找&#xff0c…

作者头像 李华
网站建设 2026/4/18 6:23:07

泰裤辣!NGS数据过滤:从“大怨种”到“高质量数据”

做NGS&#xff08;下一代测序/高通量测序&#xff09;实验时&#xff0c;我们总盼着测序仪“吐”出的原始数据能直接用——毕竟从样本制备到上机测序&#xff0c;每一步都耗费了时间和经费。但现实是&#xff0c;刚拿到的原始数据里藏着不少“杂质”&#xff0c;直接用来分析只…

作者头像 李华
网站建设 2026/4/18 7:12:44

【CSDN创作者成长】-草稿箱在哪里?

CSDN草稿箱大揭秘&#xff1a;躲猫猫的草稿箱在哪里&#xff1f; 各位CSDN的小伙伴们&#xff0c;有没有遇到过这种尴尬时刻&#xff1a;灵感爆发写了一篇绝世好文&#xff0c;结果保存后却像人间蒸发一样找不到了&#xff1f;别担心&#xff0c;你不是一个人&#xff01;今天…

作者头像 李华
网站建设 2026/4/18 8:28:40

【收藏必备】网络安全攻防全攻略:6大黑客入侵技术详解与学习路径

一、黑客常用的入侵方式 黑客常用的渗透方法大体可以分为6类&#xff1a;获取口令入侵、远程控制入侵、木马入侵、系统漏洞入侵、电子邮件入侵、网络监听入侵等。 1.获取口令入侵 顾名思义&#xff0c;就是获取到管理员或者用户的账号、密码&#xff0c;进而窃取系统信息。获…

作者头像 李华
网站建设 2026/4/17 13:58:02

【VirtualBox】【启动报错】

报错 VT-x is being used by another hypervisor (VERR_VMX_IN_VMX_ROOT_MODE). VirtualBox cant operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot (VERR_VMX_IN_VMX_ROOT_MODE). 返回 代码: NS_ERROR_FAILURE (0x80004…

作者头像 李华