DFS:二叉树的深搜与回溯

   一、计算布尔二叉树的值

. - 力扣(LeetCode)

class Solution {
public:bool evaluateTree(TreeNode* root) {if(root->left==nullptr) return root->val==0?false:true; bool left= evaluateTree(root->left);bool right=evaluateTree(root->right);return root->val==2?left||right:left&&right;//直接return root->val==2?evaluateTree(root->left)||evaluateTree(root->right):evaluateTree(root->left)&&evaluateTree(root->right)  会导致递归的时间变长,因为我们没有去记住返回值,所以一旦需要就得重新递归回去计算}
};

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

. - 力扣(LeetCode)

class Solution {
public:int dfs(TreeNode* root,int presum)//presum也是为了回溯{if(root==nullptr) return 0;presum=10*presum+root->val;//因为不管怎么样都得加if(root->left==nullptr&&root->right==nullptr) return presum;//此时如果左右不为空,加上这个结果return dfs(root->left,presum)+dfs(root->right,presum);}int sumNumbers(TreeNode* root) {  return dfs(root,0);}
};

三、二叉树剪枝

. - 力扣(LeetCode)

class Solution {
public:TreeNode* pruneTree(TreeNode* root) {if(root==nullptr) return nullptr;root->left=pruneTree(root->left);root->right=pruneTree(root->right);if(root->left==nullptr&&root->right==nullptr&&root->val==0)     delete root;return root;}
};

四、 验证二叉搜索树

 . - 力扣(LeetCode)

class Solution {
public:long prev=LONG_MIN;//比负无穷还小bool isValidBST(TreeNode* root) {if(root==nullptr) return true;//为空的话是符合条件的//进行中序遍历bool l=isValidBST(root->left);//先找左子树if(l==false) return false;//减枝(大多数的减枝就只是一个条件判断)bool temp=(prev<root->val);//判断当前是否大于前驱if(temp==false) return false;//减枝prev=root->val;//更新前驱bool r=isValidBST(root->right);//再找右子树return r;}
};

五、二叉搜索树中第k小的节点

. - 力扣(LeetCode)

class Solution {
public:int count=0;int ret=0;int kthSmallest(TreeNode* root, int k) {count=k;dfs(root);return ret;}void dfs(TreeNode* root){if(root==nullptr) return;dfs(root->left);//中序遍历if(--count==0) {ret=root->val; return;}//if判断也是剪枝dfs(root->right);}
};

 六、二叉树的所有路径

class Solution {
public:vector<string> ret;//利用全局变量来存储我们返回的结果void dfs(TreeNode* root,string path){if(root==nullptr) return;//为空 啥也不干  path+=to_string(root->val);//不为空的话,把自己给加上if(root->left==nullptr&&root->right==nullptr) ret.push_back(path); //如果是叶子节点,返回最终结果else //不是叶子节点的话,继续往后找{path+="->";//继续去左右子树去找dfs(root->left,path);dfs(root->right,path);}}vector<string> binaryTreePaths(TreeNode* root) {dfs(root,"");return ret;}
};

 七、路径总和2

. - 力扣(LeetCode)

思路1:全局path+回溯 

class Solution {
public:vector<vector<int>> ret;vector<int> path;vector<vector<int>> pathSum(TreeNode* root, int targetSum) {dfs(root,targetSum);return ret;}void dfs(TreeNode* root,int targetSum){if(root==nullptr) return;//if(targetSum<0) return;有负数,所以不能剪枝targetSum-=root->val;path.push_back(root->val);if(root->left==nullptr&&root->right==nullptr&&targetSum==0) {ret.push_back(path);return;}dfs(root->left,targetSum);if(root->left)  path.pop_back();dfs(root->right,targetSum);if(root->right)  path.pop_back();}
};

思路2:形参path记录路径结果

class Solution {
public:vector<vector<int>> ret;vector<vector<int>> pathSum(TreeNode* root, int targetSum) {dfs(root,targetSum,{});return ret;}void dfs(TreeNode* root,int targetSum,vector<int> path){if(root==nullptr) return;targetSum-=root->val;path.push_back(root->val);if(root->left==nullptr&&root->right==nullptr&&targetSum==0) ret.push_back(path);dfs(root->left,targetSum,path);dfs(root->right,targetSum,path);}
};

八、从叶节点开始的最小字符串 

. - 力扣(LeetCode)

思路1:全局path+回溯

class Solution {
public:string minpath;string path;string smallestFromLeaf(TreeNode* root) {dfs(root);return minpath;}void dfs(TreeNode* root){if(root==nullptr) return;//先加上对应的节点path=char(root->val+'a')+path;//如果是叶子节点,那么就和minpath进行比较,小的话更新if(root->left==nullptr&&root->right==nullptr)//是叶子,就要进行比较if(minpath.empty()||minpath>path) //为空的时候,也要更新minpath=path;//更新//没找到,就去左右子树找dfs(root->left);if(root->left) path.erase(path.begin());dfs(root->right);if(root->right) path.erase(path.begin());}
};

思路2:参数path记录路径结果 

class Solution {
public:string minpath;string smallestFromLeaf(TreeNode* root) {dfs(root,"");return minpath;}void dfs(TreeNode* root,string path){if(root==nullptr) return;//先加上对应的节点path=char(root->val+'a')+path;//如果是叶子节点,那么就和minpath进行比较,小的话更新if(root->left==nullptr&&root->right==nullptr)//是叶子,就要进行比较if(minpath.empty()||minpath>path) //为空的时候,也要更新minpath=path;//更新//没找到,就去左右子树找dfs(root->left,path);dfs(root->right,path);}
};

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

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

相关文章

FFMPEG C++封装(一)(C++ FFMPEG)

1 概述 FFMPEG是一个C语言开源视音频编解码库。本文将FFMPG4.1.3进行C封装&#xff0c;形成C FFMPG库。 2 架构 架构图如下所示&#xff1a; 架构说明: Init 初始化FFMPEG库。IStream 输入流&#xff0c;FFMPEG的输入音视频文件。Packet 音视频数据包Decoder 音视频编码器F…

备忘录模式实战运用(对象快照与恢复)

目录 前言 UML plantuml 类图 实战代码 模板 Originator Memento CareTaker Client 前言 使用备忘录模式&#xff0c;主要目的就是创建对象副本&#xff0c;保存对象内部状态的的快照&#xff0c;以便在需要时恢复对象至某一个历史状态。 仅仅从创建副本来看&#…

视频监控平台和视频接入网关,支持HTTPS实现视频浏览和录像回放

目录 一、https协议介绍 &#xff08;一&#xff09;什么叫https &#xff08;二&#xff09;https的工作原理 &#xff08;三&#xff09;https和http的区别 二、视频监控平台为何要采用https &#xff08;一&#xff09;采用HTTPS浏览视频的好处体现在以下几个方面&…

java多线程——概述,创建方式及常用方法

前言&#xff1a; 学习到多线程了&#xff0c;整理下笔记&#xff0c;daydayup!!! 多线程 什么是线程 线程&#xff08;Thread&#xff09;是一个程序内部的一条执行流程。若程序只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 什么是多线程 多线程是指从软硬件上…

npm ERR! errno CERT_HAS_EXPIRED

1 问题描述 使用npm命令安装相关依赖报错&#xff1a;npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired报错示例图如下所示&#xff1a; 2原因分析…

如何在极狐GitLab 配置 邮件功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

深入理解Java接口:定义、使用与重要性(day13)

导语&#xff1a;Java接口是Java编程语言中的一个核心概念&#xff0c;它提供了一种定义方法但不包含方法实现的方式。接口在Java编程中扮演着重要角色&#xff0c;能够帮助我们实现代码的高内聚、低耦合&#xff0c;提高代码的复用性和可维护性。本文将详细介绍Java接口的定义…

Java毕业设计-基于springboot开发的招聘信息管理系统平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、企业后台管理模块4、用户后台管理模块 四、毕设内容和源代码获取总结 Java毕业设计-基于spri…

vue3封装Element表格自适应

表格高度自适应 分页跟随表格之后 1. 满屏时出现滚动条 2. 不满屏时不显示滚动条 坑 表格设置maxHeight后不出现滚动条 解决方案 表格外层元素设置max-height el-table–fit 设置高度100% .table-box {max-height: calc(100% - 120px); } .el-table--fit {height: 100%; }示例代…

数组类模板(类模拟实现静态数组)

目录 介绍&#xff1a; 案例描述&#xff1a; 思路&#xff1a; 对要求分别分析实现&#xff1a; 创建对应的类&#xff1a; 1.定义一个数组类 2.类中属性有&#xff1a;数组&#xff0c; 容量&#xff0c; 大小 3.数组函数有&#xff1a; 构造函数&#xff08;容量&am…

Java项目:80 springboot师生健康信息管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色&#xff1a;管理员、宿管、学生 管理员管理宿管员&#xff0c;管理学生&#xff0c;修改密码&#xff0c;维护个人信息。 宿管员…

数据结构——链表(单链表)

大家好&#xff0c;又是我&#xff08;小锋&#xff09;&#xff0c;今天给大家带了一个比较有挑战的章节&#xff08;链表&#xff09;&#xff0c;但是不用担心&#xff0c;小锋会陪大家一起度过。 顺序表的思考与问题 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) …