【算法】二叉树中的dfs



快乐的流畅:个人主页


个人专栏:《算法神殿》《数据结构世界》《进击的C++》

远方有一堆篝火,在为久候之人燃烧!

文章目录

  • 引言
  • 一、计算布尔二叉树的值
  • 二、求根节点到叶节点数字之和
  • 三、二叉树剪枝
  • 四、验证搜索二叉树
  • 五、二叉搜索树中第k小的元素
  • 六、二叉树的所有路径
  • 总结

引言

dfs在二叉树中有了更进一步地体现,通过二叉树中的dfs相关题型,深刻理解全局变量、回溯和剪枝

一、计算布尔二叉树的值


思路:

  1. 先计算出左右子树的值,再根据当前结点的值进行逻辑运算
  2. 终止条件:叶子节点时,返回节点值
class Solution
{
public:bool dfs(TreeNode* root){if(!root->left && !root->right) return root->val;bool left = dfs(root->left);bool right = dfs(root->right);return root->val == 2 ? left || right : left && right;}bool evaluateTree(TreeNode* root){return dfs(root);}
};

二、求根节点到叶节点数字之和


思路:

  1. 函数头设计:presum保存从根节点到当前节点路径的和,返回值代表左右子树所有路径之和
  2. presum设置为临时变量,以便回溯
  3. 每次先计算当前路径和sum,再返回左右子树所有路径之和
  4. 终止条件:root为空,则返回0;root为叶子节点,则返回当前路径的数字和
class Solution
{
public:int dfs(TreeNode* root, int presum){if(!root) return 0;int sum = presum*10 + root->val;if(!root->left && !root->right) return sum;return dfs(root->left, sum) + dfs(root->right, sum);}int sumNumbers(TreeNode* root){return dfs(root, 0);}
};

三、二叉树剪枝


思路:

  1. 每次先遍历左右子树进行剪枝(注意链接起来)
  2. 再判断当前结点是否为叶子节点,且值为0,若成立则删除该结点,返回空,否则返回该节点
  3. 终止条件:root为空,返回空
class Solution
{
public:TreeNode* dfs(TreeNode* root){if(!root) return nullptr;root->left = dfs(root->left);root->right = dfs(root->right);if(!root->left && !root->right && root->val == 0) return nullptr;else return root;}TreeNode* pruneTree(TreeNode* root){return dfs(root);}
};

四、验证搜索二叉树


思路:

  1. prev保存上一个结点的值,以便与当前结点进行比较
  2. 中序遍历,如果prev < root->val,则更新prev,否则返回false
  3. 剪枝:每次对当前情况判断,若不满足直接返回false,不用继续深搜判断
  4. 终止条件:如果root为空,则返回true
class Solution
{
public:long long prev = LLONG_MIN;bool dfs(TreeNode* root){if(root == nullptr) return true;if(!dfs(root->left)) return false;if(prev < root->val) prev = root->val;else return false;if(!dfs(root->right)) return false;return true;}bool isValidBST(TreeNode* root){return dfs(root);}
};

五、二叉搜索树中第k小的元素


思路:

  1. count计算访问结点次数,ret保存结果
  2. 中序遍历,每次–count,当count为0,则保存结果
  3. 终止条件:当root为空时,return;
  4. 剪枝:当count为空时,return;
class Solution
{
public:int count = 0;int ret = -1;void dfs(TreeNode* root){if(root == nullptr || count == 0) return;dfs(root->left);--count;if(count == 0) ret = root->val;dfs(root->right);}int kthSmallest(TreeNode* root, int k){count = k;dfs(root);return ret;}
};

六、二叉树的所有路径


思路:

  1. ret保存所有路径,path表示单条路径
  2. path设置为临时变量,以便回溯
  3. 先序遍历,若为叶子节点,则加上当前字符,并添加到ret中,若不为叶子节点,则加上当前字符和 “->”
  4. 终止条件:当root为空,return;
class Solution
{vector<string> ret;
public:void dfs(TreeNode* root, string path){if(!root) return;if(!root->left && !root->right){path += to_string(root->val);ret.push_back(path);}else path += to_string(root->val) + "->";dfs(root->left, path);dfs(root->right, path);}vector<string> binaryTreePaths(TreeNode* root){dfs(root, "");return ret;}
};

总结

  • 全局变量
    • 在dfs中,全局变量非常好用(能拉全局就拉全局),它可以减少函数头设计的参数,简化函数体过程
    • 但是有时使用临时变量更加合适,这种情况出现在“恢复现场”比较麻烦时,用临时变量反而能大大简化过程
  • 回溯
    • 回溯的过程中,要“恢复现场”
  • 剪枝
    • 即时进行判断,避免不必要的搜索

真诚点赞,手有余香

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

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

相关文章

搭建一个Xx431?

搭建一个Xx431? 嘿uu们!刚结束了一周六天班感觉如何? 我的状态倒还行,工作生活总能找到乐子,本周整活就是用纸巾和蛋糕托做的油灯,另外想制冷片做个温水冷水可调的杯托,但我还不会搞3d,希望今年能搞起来. 题外话就说到这,这个选题也是因为实际遇到的问题需要这玩意,下班路…

【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决

一般安卓提取apk图标我们有两种常用方法&#xff1a; 1、如果已经获取到 ApplicationInfo 对象&#xff08;假设名为 appInfo&#xff09;&#xff0c;那么我们获取方法为&#xff1a; appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…

linux上使用mariadb安装mysql环境

之前都是手动安装mysql数据库&#xff0c;现在尝试下在线安装&#xff0c;为后面的项目部署做准备&#xff0c;突然发现使用mariadb安装mysql环境真的超级简单。 1.使用mariadb安装mysql 安装服务端&#xff1a; yum install mariadb-server -y 安装客户端&#xff1a; yum i…

618洗地机推荐,市面上各式各样的洗地机怎么选?这里有答案

洗地机的出现极大地改变了清洁方式&#xff0c;通过结合扫地、拖地、吸尘等多种功能&#xff0c;实现了一机多用的便捷清洁体验。而且洗地机不需要弯腰&#xff0c;每次也不用清洁很长时间&#xff0c;节省出来的时间可以更好的休息&#xff0c;但是市面上各式各样的洗地机怎么…

基于springboot+vue+Mysql的外卖点餐系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

virtualbox下ubantu20.04版本实现与window的复制粘贴

1.建议开启双向 2.打开Ubuntu命令终端 快捷键 ctrialtt&#xff0c;具体在设置里面查看快捷键 3.卸载已有工具 sudo apt-get autoremove open-vm-tools4.安装 sudo apt-get install open-vm-tools-desktop5.记得sudo reboot重启 sudo reboot这里记得加上sudo&#xff0c;…

【管理咨询宝藏96】企业数字化转型的中台战略培训方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏96】企业数字化转型的中台战略培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 数字化转型是指&…

搭建Docker私服镜像仓库Harbor

1、概述 Harbor是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 Harbor 的所有组件都在 Dcoker 中部署&#xff0c;所以 Harbor 可使用 Docker Compose 快速部署。 …

静态住宅代理 IP 的影响

在不断发展的在线业务和数字营销领域&#xff0c;保持领先地位势在必行。在业界掀起波澜的最新创新之一是静态住宅代理 IP 的利用。这些知识产权曾经是为精通技术的个人保留的利基工具&#xff0c;现在正在成为各行业企业的游戏规则改变者。 一、静态住宅代理IP到底是什么&…

【C语言】精品练习题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 题目十&#xff1a; 题目十一&#xff1a; 题目十二&#xff1a; 题目十…

已经安装tensorflow,仍报错No module named ‘tensorflow‘

在安装某些python虚拟环境的教程文章中&#xff0c;经常看到有评论区说安装了但是调用显示无模块&#xff0c;例如pytorch和tensorflow等等。 其实跟之前我写过的一篇文章解决方法类似&#xff0c;就是python项目中需要应用哪个虚拟环境&#xff0c;这个项目的python解释器就选…

Docker学习笔记(一)安装Docker、镜像操作、容器操作、数据卷操作

文章目录 1 Docker介绍1.1 Docker的优势1.1.1 应用部署的环境问题1.1.2 Docker解决依赖兼容问题1.1.3 Docker解决操作系统环境差异1.1.4 小结 1.2 Docker和虚拟机的区别1.3 Docker架构1.3.1 镜像和容器1.3.2 DockerHub1.3.3 Docker架构 1.4 安装Docker1.4.1 卸载旧版本Docker&a…