[Lc_2 二叉树dfs] 布尔二叉树的值 | 根节点到叶节点数字之和 | 二叉树剪枝
目录
1.计算布尔二叉树的值
题解
2.求根节点到叶节点数字之和
3. 二叉树剪枝
题解
1.计算布尔二叉树的值
链接:2331. 计算布尔二叉树的值
给你一棵 完整二叉树 的根,这棵树有以下特征:
- 叶子节点 要么值为
0要么值为1,其中0表示False,1表示True。 - 非叶子节点 要么值为
2要么值为3,其中2表示逻辑或OR,3表示逻辑与AND。
计算 一个节点的值方式如下:
- 如果节点是个叶子节点,那么节点的 值 为它本身,即
True或者False。 - 否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。
返回根节点 root 的布尔运算值。
完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。
叶子节点 是没有孩子的节点。

题解
给一颗完整二叉树,孩子节点要么是0要么是2,不存在1个孩子节点。
叶子节点和非叶子节点数字分别代表不同的意思,最后将root根结果bool值返回去。

解法:递归
宏观角度看待递归
当想知道root根节点bool值时
- 我要先知道左子树bool值,在知道右子树bool值,然后将左右子数的bool值和root本身信息做整合。
- 当我们要知道左子树和右子树的bool值,你会发现它和大问题是一样的。
- 大问题是解决整棵树的bool值,小问题是解决左子树bool值,右子树bool值。
- 此时把左指针传给dfs,dfs把左子树bool值给你,把右指针传给dfs,dfs把右子树bool值给你。
所以dfs非常好设计。
1. 函数头
bool dfs(TreeNode* root)

2. 函数体
先求左子树bool值,在求右子树bool,不要管递归如何执行,只需要知道你给它数据它一定能完成任务。
- bool left=dfs(root->left)
- bool right=dfs(root->right)
最后在将左子树和右子树bool值和root做整合。
3. 递归出口
到叶子节点就不需要往后递归了,此时返回结果就行了
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool evaluateTree(TreeNode* root) {return dfs(root);}bool dfs(TreeNode* root){if(root->left == nullptr){return root->val;}bool left=dfs(root->left);bool right=dfs(root->right);return root->val == 2 ? left | right : left & right;
//叶子节点 才有值 其他都是操作符}
};
2.求根节点到叶节点数字之和
链接:129. 求根节点到叶节点数字之和
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
- 例如,从根节点到叶节点的路径
1 -> 2 -> 3表示数字123。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。

将根到叶子节点组合的数加起来

解法:递归
首先我们要找到 相同子问题,在树中相同子问题很好找,只需要关注递归到每一层需要干什么事情即可。
当它们干的都是一样的事情,这就是相同的子问题。

当递归到5这一层,我发现要拿到和5相连下面的叶子节点的数把它们加起来,然后返回给根节点。当到5这一层
- 首先要把12先给我传过来,不然我怎么算出1258,也就是到某一层要把它之前路径上之后给我传过来 tmp。然后拿到这个12,先算出125。
- 然后把125传给左边
- 把125传给右边
- 然后把左边值的和与右边值的和相加,return 上一层节点 ret
在这5这一层要完成4个任务,同理其他层也是要完成相同的任务。
1.函数头
首先要有一个返回值,就是传给dfs一个根节点把和它相连的叶子节点的和返回。
- 但是要注意的是,我们除了要传一个根节点,还需要再把递归到该层的上面路径和拿到!
- 因此函数头是int dfs(root,num)
2.函数体
1、2、3、4个步骤
3.递归出口
- 当到叶子节点就可以返回了,但是要注意的是,这个递归出应该在步骤1之后的
- 因为到叶子节点, 也要把叶子节点的数加上才向上返回的。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int sumNumbers(TreeNode* root) {return dfs(root,0);}//存上一层的numint dfs(TreeNode* root,int num){//更新 当前层数值num=num*10+root->val;//左右为空 就返回这个值if(!root->left && !root->right) return num;int ret=0;if(root->left) ret+=dfs(root->left,num);if(root->right) ret+=dfs(root->right,num);return ret;}
};
3. 二叉树剪枝
链接:814. 二叉树剪枝
给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。
返回移除了所有不包含 1 的子树的原二叉树。
节点 node 的子树为 node 本身加上所有 node 的后代。

题解
注意这里的剪枝和前面说的剪枝是不一样的,前面的是那条路不是通往终点的路不能在走了,这里的剪枝真的就是把分枝剪掉!
- 返回移除了所有 不包含 1 的子树 的原二叉树 的意思是,就是如果子树全是0就把它剪掉。
- 如果子数有1就不能剪掉。

通过决策树,抽象出递归的三个核心问题
也就是说通过,完成二叉树剪枝这个任务,完成递归三个核心问题。
- 像之前先把每个子问题要完成任务先找到,但是有时候某些道题非常麻烦,无法总结出子问题到底干了什么问题,这道题是给一个根节点然后把子树全为0剪掉然后把新根节点返回来。
- 但是有些题特别抽象你根本无法总结出来你让这个递归去完成什么任务,任务太多了。此时我们要有一个能力,通过研究递归的过程来总结出函数头、函数体、递归出口!
首先这肯定是一个后序遍历,先要确定左右子树是什么情况才能决定是否把这个子树干掉。
- 当作后序遍历到底最左节点,然后再后序发现它左为空右为空,然后自己本身也是0,说明可以给它剪枝。
- 然后回到上一层但是有一个问题,是不是要修改上一层左子树的指针啊,因此这个递归函数要有一个返回值 TreeeNode*。
然后如果左右子树都为空,但自己是1,说明不能剪枝

当我们把根左子树都弄好了,其实整个递归过程就出来。

函数头
- TreeNode* dfs(root) 给一个根节点,然后把结果给我
函数体
- 左子树右子树都搞完返回给我一个东西,然后通过返回值 再结合我自己看是否需要把自己删除。
- 1.左子树、2.右子树、 3.判断
递归出口
- 遇到null结束,就返回null
递归处理 树
- 你只需要管它是做什么的,拿去用,而不需要在意它是怎么实现的。
- 我们的pruneTree是用来将树去除不包含1的子树。
- 那么我们可以用它来干嘛?我们可以对root的左右子树都进行一次pruneTree,现在root的左右子树都是去除了不包含1的子树的子树或者null。
- 那么我们只需要判断什么?只需要在root不存在左右子树且自身为0时,返回null即可,如果root.val为1或者左右子树存在任一,都需要返回自身。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* pruneTree(TreeNode* root) {//出口if(!root) return nullptr;root->left=pruneTree(root->left);//递归 左子树root->right=pruneTree(root->right);//递归 右子树//如果 当前是 叶子节点,且值为0,剪枝if(!root->left && !root->right && root->val==0)return nullptr;return root;}
};相关文章:
[Lc_2 二叉树dfs] 布尔二叉树的值 | 根节点到叶节点数字之和 | 二叉树剪枝
目录 1.计算布尔二叉树的值 题解 2.求根节点到叶节点数字之和 3. 二叉树剪枝 题解 1.计算布尔二叉树的值 链接:2331. 计算布尔二叉树的值 给你一棵 完整二叉树 的根,这棵树有以下特征: 叶子节点 要么值为 0 要么值为 1 ,其…...
SOFABoot-07-版本查看
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金服开源的 s…...
蓝桥杯 之 第27场月赛总结
文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题,是一个二维dp的问题,转化为对应的动态规划求解 力扣的相似题目 可以关注灵神…...
第十六章:Specialization and Overloading_《C++ Templates》notes
Specialization and Overloading 一、模板特化与重载的核心概念二、代码实战与测试用例三、关键知识点总结四、进阶技巧五、实践建议多选题设计题代码测试说明 一、模板特化与重载的核心概念 函数模板重载 (Function Template Overloading) // 基础模板 template<typename…...
可视化动态表单动态表单界的天花板--Formily(阿里开源)
文章目录 1、Formily表单介绍2、安装依赖2.1、安装内核库2.2、 安装 UI 桥接库2.3、Formily 支持多种 UI 组件生态: 3、表单设计器3.1、核心理念3.2、安装3.3、示例源码 4、场景案例-登录注册4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、纯 JSX 案例 1、Form…...
Amdahl 定律
Amdahl 定律是用来表示,当提高系统某部分性能时对整个系统的影响,其公式如下: a表示我们提升部分初始耗时比例,k是我们的提升倍率,通过这个公式我们可以轻松的得知对每一部分的提醒,对整个系统带来的影响…...
rust学习笔记19-泛型
Rust 的泛型(Generics)允许编写可复用的代码,通过抽象类型或行为来避免重复逻辑。 1. 泛型的基本使用 函数泛型 在函数中定义泛型参数,支持不同类型的数据操作: fn max<T: PartialOrd>(a: T, b: T) -> T …...
Linux系统之美:环境变量的概念以及基本操作
本节重点 理解环境变量的基本概念学会在指令和代码操作上查询更改环境变量环境变量表的基本概念父子进程间环境变量的继承与隔离 一、引入 1.1 自定义命令(我们的exe) 我们以往的Linux编程经验告诉我们,我们在对一段代码编译形成可执行文件后…...
数学爱好者写的编程系列文章
作为一个数学爱好者,我大学读的专业却不是数学专业,而是跟计算机有关的专业。原本我对编程一窍不通,平时上课也是在看数学文献,作业基本靠同学,考试及格就行。不过后来因为毕业的压力,我还是拥抱编程了&…...
pnpm 报错 Error: Cannot find matching keyid 解决
1. 查看corepack版本,升级至0.31.0 npm i -g corepack0.31.0 这里注意环境变量,可能升级后还是指向旧版本,可以选择更新环境变量或者删除原指向的corepack命令 2. 更新pnpm corepack install -g pnpmlatest 问题解决。...
dcat-admin已完成项目部署注意事项
必须 composer update 更新项目php artisan admin:publish 发布dcatadmin的静态资源手动创建目录(如果没有) storage/appstorage/framework/cachestorage/framework/sessionsstorage/framework/views 需检查 php不要禁用以下函数 putenvsymlinkproc_…...
Ubuntu实时读取音乐软件的音频流
文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的,我需要在Ubuntu中,实时读取正在播放音乐的音频流,然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现,好处是可以直接利用Helvum…...
大语言模型进化论:从文本理解到多模态认知的革命之路
一、Transformer:认知革命的基石 ### 1.1 自注意力机制:神经网络的"量子纠缠" python # 自注意力核心公式实现 def self_attention(Q, K, V, maskNone): d_k Q.size(-1) scores torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(…...
《Operating System Concepts》阅读笔记:p460-p4470
《Operating System Concepts》学习第 36 天,p460-p4470 总结,总计 11 页。 一、技术总结 无。 二、英语总结(生词:3) 1.lifespan (1)lifespan: life span(“the period of time that sth exists or happens”) c. 也写作 life-span, …...
Postgresql 删除数据库报错
1、删除数据库时,报错存在其他会话连接 ## 错误现象,存在其他的会话连接正在使用数据库 ERROR: database "cs" is being accessed by other users DETAIL: There is 1 other session using the database.2、解决方法 ## 终止被删除数据库下…...
Fiddler抓包工具最快入门
目录 前言 了解HTTP网络知识 简单了解网络访问过程 简单了解HTTP网络传输协议 工作过程 HTTP请求: Fildder工具使用教程 抓包的概念 一、什么是抓包 二、为什么要抓包 三、抓包的原理(图解) Fiddler工具 安装 使用 Fiddler查看…...
编译器与中间表示:LLVM与GCC、G++、Clang的关系详解
编译器与中间表示:LLVM与GCC、G、Clang的关系详解 引言 编译器是软件开发中不可或缺的工具,它负责将高级语言(如C/C、Java等)转换为机器语言,使计算机能够理解和执行程序。中间表示(Intermediate Represe…...
《深度剖析:鸿蒙系统不同终端设备的UI自适应布局策略》
在万物互联的时代,鸿蒙系统以其独特的分布式理念和强大的技术架构,迅速在智能终端领域崭露头角。随着鸿蒙生态的不断壮大,越来越多的开发者投身其中,致力于为用户打造丰富多样的应用体验。然而,如何让应用在不同终端设…...
股指期货贴水波动,影响哪些投资策略?
先来说说“贴水”。简单来说,贴水就是股指期货的价格比现货价格低。比如,沪深300指数现在是4000点,但股指期货合约的价格只有3950点,这就叫贴水。贴水的大小会影响很多投资策略的收益,接下来我们就来看看具体的影响。 …...
1.1 结构体与类对象在List中使用区别
一、问题的起源如下的代码是错误的,无法编译通过 struct Point {public int X;public int Y; }List<Point> points new List<Point> { new Point { X 1, Y 2 } }; points[0].X 10; // 编译错误!无法修改副本的字段 二、原因分析 在C#中&…...
matlab近似计算联合密度分布
在 Matlab 中,当A和B是两个序列数据时,可以通过以下步骤来近似求出A大于B的概率分布:数据准备:确保序列A和B具有相同的长度。如果长度不同,需要进行相应的处理(例如截取或插值)。计算A大于B的逻…...
基于WebAssembly的浏览器密码套件
目录 一、前言二、WebAssembly与浏览器密码套件2.1 WebAssembly技术概述2.2 浏览器密码套件的需求三、系统设计思路与架构3.1 核心模块3.2 系统整体架构图四、核心数学公式与算法证明4.1 AES-GCM加解密公式4.2 SHA-256哈希函数五、异步任务调度与GPU加速设计5.1 异步任务调度5.…...
RHCE 使用nginx搭建网站
一。准备工作 Windows dns映射 创建目录网页 vim 编辑内容 添加如下 重启nginx服务,在Windows浏览器进行测试...
pcap流量包分析
先说一个阿里云学生无门槛免费领一年2核4g服务器的方法: 阿里云服务器学生无门槛免费领一年2核4g_阿里云学生认证免费服务器-CSDN博客 PCAP文件是一种网络数据包捕获文件格式,通常被用来捕获和存储网络流量数据。对PCAP文件进行分析可以帮助识别网络中的…...
OpenCV专利收费免费模块介绍
一、核心模块(免费,商业 / 非商业均可使用) ML 模块(机器学习) 功能:支持向量机(SVM)、K 均值聚类、神经网络(ANN)等。收费状态:免费。属于 OpenC…...
AtCoder Beginner Contest 398(ABCDEF)
A - Doors in the Center 翻译: 找到一个满足下面情况长为N的字符串: 每个字符是 - 或 。是一个回文。包含一个或两个 。如果包含两个相邻的 。 如此字符串为独一无二的。 思路: 从两端使用 开始构造回文。在特判下中间部分,…...
单表达式倒计时工具:datetime的极度优雅(智普清言)
一个简单表达式,也可以优雅自成工具。 笔记模板由python脚本于2025-03-22 20:25:49创建,本篇笔记适合任意喜欢学习的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 Pyth…...
【2025 深圳大学-腾讯云程序设计竞赛(热身赛)】题解
比赛链接 A. Cloud Studio的共享连接 题目大意 && Solution 给定 T T T 组长度均为 12 12 12 的字符串 s s s。 对每个 s s s,将其按从左到右的顺序两两分组形成 6 6 6 个 A S C I I \rm{ASCII} ASCII 码,对这 6 6 6 个 A S C I I \…...
C语言基础与进阶学习指南(附运行效果图及术语解析)
C语言基础与进阶学习指南(附运行效果图及术语解析) 目录 C语言标准与编译流程CPU与内存基础C语言基础语法数据类型详解变量与内存管理运算符与表达式输入输出函数函数与内存管理指针与内存操作结构体与高级应用 1. C语言标准与编译流程 1.1 C语言标准演…...
2025年3月GESP八级真题解析
第一题——上学 题目描述 C 城可以视为由 n n n 个结点与 m m m 条边组成的无向图。这些结点依次以 1 , 2 , … , n 1,2,…,n 1,2,…,n 标号,边依次以 1 , 2 , … , m 1,2,…,m 1,2,…,m 标号。第 i i i 条边( 1 ≤ i ≤ m 1≤i≤m 1≤i≤m&#…...
