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.mzph.cn/news/780886.shtml

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

相关文章

1.1 单片机的概念

一,单片机的概念 单片机(Single-Chip Microcomputer),也被称为单片微控制器,是一种集成电路芯片。它采用超大规模集成电路技术,将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、…

springcloud基本使用(搭建eureka服务端)

创建springbootmaven项目 next next finish创建成功 删除项目下所有文件目录&#xff0c;只保留pox.xml文件 父项目中的依赖&#xff1a; springboot依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s…

Swift:“逻辑运算子“与“比较运算符“

1. 逻辑非 ! 逻辑非运算符 ! 是用于对布尔值取反的。当操作数为 true 时&#xff0c;! 将返回 false&#xff0c;而当操作数为 false 时&#xff0c;! 将返回 true。 let isTrue true let isFalse !isTrue // isFalse 现在是 false 2. 逻辑与 && 逻辑与运算符 &a…

爬取b站音频和视频数据,未合成一个视频

一、首先找到含有音频和视频的url地址 打开一个视频&#xff0c;刷新后&#xff0c;找到这个包&#xff0c;里面有我们所需要的数据 访问这个数据包后&#xff0c;获取字符串数据&#xff0c;用正则提取&#xff0c;再转为json字符串方便提取。 二、获得标题和音频数据后&…

linux基础命令篇:Linux基础命令讲解——文件浏览(cat、less、head、tail和grep)

Linux基础命令讲解——文件浏览&#xff08;cat、less、head、tail和grep&#xff09; 本文详细介绍Linux中的cat、less、head、tail和grep命令&#xff0c;这些命令在日常工作中非常实用&#xff0c;以下是关于这些命令的详细介绍&#xff1a; 1. cat命令&#xff1a;用于查看…

JUC:synchronized优化——锁的升级过程(偏向锁->轻量级锁->重量级锁)以及内部实现原理

文章目录 锁的类型轻量级锁重量级锁自旋优化偏向锁偏向锁的细节偏向锁的撤销批量重偏向批量撤销锁消除 锁的类型 重量级锁、轻量级锁、偏向锁。 加锁过程&#xff1a;偏向->轻量级->重量级 轻量级锁 轻量级锁的使用场景&#xff1a;如果一个对象虽然有多线程要加锁&am…

登录者个人信息查询

目录 &#x1f95e;1.vo层描述 &#x1f37f;2..vo层创建 &#x1f32d;3.编写controller层 &#x1f953;4.service层 &#x1f9c2;5.测试 1.vo层描述 Spring Boot项目中的实体类通常用于映射数据库表&#xff0c;包含了业务对象的所有属性。然而&#xff0c;前端或其…

Jenkins详细安装配置部署

目录 简介一、安装jdk二、安装jenkins这里如果熟悉 Jenkins &#xff0c;可以【选择插件来安装】&#xff0c;如果不熟悉&#xff0c;还是按照推荐来吧。注意&#xff1a; 三、插件安装如果上面插件安装&#xff0c;选择的不是【安装推荐的插件】&#xff0c;而是【选择插件来安…

ZYNQ学习之PetaLinux与Vitis的安装

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Petalinux安装 1.1、Petalinux资源下载 百度云安装包&#xff1a; Petalinux 安装…

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

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

OpenHarmony:RichEditor组件样例开发

使用 richEditor 组件实现一个富文本编辑框&#xff0c;包含富文本编辑区域和功能栏&#xff0c;功能栏中有多个按键&#xff0c;可以调整字体大小、字体样式、字体颜色、布局&#xff0c;并可以插入图片。 api 版本&#xff1a;api11 主页面 import { TitleBar } from ../.…

element跑马灯/轮播图,第一页隐藏左边按钮,最后一页隐藏右边按钮(vue 开箱即用)

图示&#xff1a; 第一步&#xff1a; <el-carousel :class"changeIndex0?leftBtnNone:changeIndeximgDataList.length-1? rightBtnNone:" height"546px" :autoplay"false" change"changeNext"><el-carousel-item v-for…

Stata 15 for Mac:数据统计分析新标杆,让研究更高效!

Stata 是一种统计分析软件&#xff0c;适用于数据管理、数据分析和绘图。Stata 15 for Mac 具有以下功能&#xff1a; 数据管理&#xff1a;Stata 提供强大的数据管理功能&#xff0c;用户可以轻松导入、清洗、整理和管理数据集。 统计分析&#xff1a;Stata 提供了广泛的统计…

A Little Is Enough: Circumventing Defenses For Distributed Learning

联邦学习的攻击方法&#xff1a;LIE 简单的总结&#xff0c;只是为了能快速想起来这个方法。 无目标攻击 例如总共50个客户端&#xff0c;有24个恶意客户端&#xff0c;那么这个时候&#xff0c;他需要拉拢2个良性客户端 计算 50 − 24 − 2 50 − 24 0.923 \frac{50-24-2}{…

瑞_23种设计模式_中介者模式

文章目录 1 中介者模式&#xff08;Mediator Pattern&#xff09;1.1 介绍1.2 概述1.3 中介者模式的结构1.4 中介者模式的优缺点1.5 中介者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《2…

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

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

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

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

排序---数组和集合

1、数组排序 Arrays.sort(int[] a)这种形式是对一个数组的所有元素进行排序&#xff0c;并且是按照从小到大的排序。 public static void main(String[] args) {Integer []arr {1,2,3,4,5,6};//升序Arrays.sort(arr);for (int x:arr){System.out.print(x " ");}Sys…

IRIS / Chronicles 定义 Item Response Type 字段属性

Response Type 在关系数据库中可能没有这个选项&#xff0c;我们对关系数据库表中的数据返回的数据就是是数据&#xff0c;通常不再做过多定义。 但是 IRIS 会对返回的数据也做一些定义&#xff0c;这个就是我们说的 Response Type。 Single &#xff08;单一&#xff09; 这…

二维随机变量的条件分布-已知X概率密度,X条件下的Y概率密度求解y的概率密度

问题&#xff1a;设数X在区间(0,1)上随机地取值,当观察到Xx(0<x<1)时,数Y在区间(x,1)上随机地取值.求Y的概率密度f(y)&#xff1f; 求解&#xff1a; 首先&#xff0c;数X在区间(0,1)上均匀分布&#xff0c;因此其概率密度函数fX​(x)为&#xff1a; fX​(x)1 0<…