【DFS】羌笛何须怨杨柳,春风不度玉门关 - 4. 二叉树中的深搜

【DFS】羌笛何须怨杨柳,春风不度玉门关 - 4. 二叉树中的深搜
在这里插入图片描述
本篇博客给大家带来的是二叉树深度优先搜索的解法技巧,在后面的文章中题目会涉及到回溯和剪枝,遇到了一并讲清楚.
🐎文章专栏: DFS
🚀若有问题 评论区见
❤ 欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .

王子,公主请阅🚀

要开心

要快乐

顺便进步

1. 计算二叉树中的布尔值

题目链接:2331. 计算布尔二叉树的值

题目内容:

给你一棵 完整二叉树 的根,这棵树有以下特征:

叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示 True 。
非叶子节点 要么值为 2 要么值为 3 ,其中 2 表示逻辑或 OR ,3 表示逻辑与 AND 。
计算 一个节点的值方式如下:

如果节点是个叶子节点,那么节点的 值 为它本身,即 True 或者 False 。
否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。
返回根节点 root 的布尔运算值。

完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。

叶子节点 是没有孩子的节点。

在这里插入图片描述


输入:root = [2,1,3,null,null,0,1]
输出:true
解释:上图展示了计算过程。
AND 与运算节点的值为 False AND True = False 。
OR 运算节点的值为 True OR False = True 。
根节点的值为 True ,所以我们返回 true 。
示例 2:

输入:root = [0]
输出:false
解释:根节点是叶子节点,且值为 false,所以我们返回 false 。

提示:

树中节点数目在 [1, 1000] 之间。
0 <= Node.val <= 3
每个节点的孩子数为 0 或 2 。
叶子节点的值为 0 或 1 。
非叶子节点的值为 2 或 3 。

一. 分析

要想知道根节点的布尔值,就得先求左子树和右子树的布尔值.

在这里插入图片描述





二. 写递归代码的具体步骤

1. 大量重复子问题(函数头)
boolean dfs(TreeNode root)

2. 只关注某一个子问题
想知道根节点的布尔值,就得先求左子树和右子树的布尔值

在这里插入图片描述


3. 递归出口
根据题意,
节点值为0,返回false
节点值为1,返回true.

三. 代码实现
classSolution{publicbooleanevaluateTree(TreeNode root){returndfs(root);}publicbooleandfs(TreeNode root){if(root.val ==0){returnfalse;}if(root.val ==1){returntrue;}boolean left =dfs(root.left);boolean right =dfs(root.right);return root.val ==2? left | right : left & right;}}

2. 求根节点到叶节点数字之和

题目链接:129. 求根节点到叶节点数字之和

题目内容:

  1. 求根节点到叶节点数字之和
    已解答
    中等
    相关标签
    相关企业
    给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
    每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。

叶节点 是指没有子节点的节点。

示例 1:

在这里插入图片描述


输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25

在这里插入图片描述


输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026

提示:

树中节点的数目在范围 [1, 1000] 内
0 <= Node.val <= 9
树的深度不超过 10

一. 分析题意


在这里插入图片描述

以上图得1节点为例,
第一: 需要接收来自上一层的49.
第二: 需要往下传递49*10+1=491.
第三: 到达叶子节点,需要将结果返回.
分析出这三点,就不难写出递归代码了.

二. 具体步骤

1. 大量重复子问题->(函数头)
上一层节点×10+根节点传给子节点.直到叶子节点才返回最终结果. int dfs(root,presum). presum记录上一层的值.

2. 某一子问题的工作流程

①计算当前的值,presum*10+root.val;
②前序遍历递归左子树
③前序遍历递归右子树

3. 递归出口
当前节点为叶子节点时,返回结果

三. 代码实现
classSolution{publicintsumNumbers(TreeNode root){returndfs(root,0);}publicintdfs(TreeNode root,int presum){ presum = presum*10+root.val;if(root.left ==null&& root.right ==null){return presum;}int ret =0;if(root.left !=null){ ret +=dfs(root.left,presum);}if(root.right !=null){ ret +=dfs(root.right,presum);}return ret;}}


总结: 凡是能用递归来解决的二叉树题目, 要么是前序遍历,要么是后序遍历, 还有一部分是中序遍历.大部分题都是这样的,一般可以先尝试前序,再后序,最后中序.
本篇博客到这里就结束啦, 感谢观看 ❤❤❤
🐎期待与你的下一次相遇😊😊😊

Read more

Flutter 三方库 fsrs 突破鸿蒙端智能认知交互模型的高频动态复习算法引擎适配:搭建复杂离线记忆曲线追踪体系全息掌握大脑突触留存衰退参数助力超效在线学习-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 fsrs 突破鸿蒙端智能认知交互模型的高频动态复习算法引擎适配:搭建复杂离线记忆曲线追踪体系全息掌握大脑突触留存衰退参数助力超效在线学习-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 fsrs 突破鸿蒙端智能认知交互模型的高频动态复习算法引擎适配:搭建复杂离线记忆曲线追踪体系全息掌握大脑突触留存衰退参数助力超效在线学习 前言 在 OpenHarmony 智慧教育与个人效能类应用开发中,如何帮助用户高效记忆海量知识点(如单词、医学条目、法律条文)?如果仅仅采用简单的均匀复习,学习效率会由于大量重复已知内容而极其低下。fsrs(Free Spaced Repetition Scheduler)算法库为开发者提供了一套比传统的 Anki (SM-2) 更先进、基于 DSR 模型(Difficulty, Stability, Retrievability)的现代间隔重复调度算法。本文将实战介绍如何在鸿蒙端利用该算法构建一个顶级水平的学习大脑。 一、原直线性 / 概念介绍 1.1 基础原理/概念介绍 fsrs 的核心逻辑是基于 基于三个动态指标的三阶模型:难度 (Difficulty)、稳定性

By Ne0inhk
python基于逻辑回归的信用卡评分模型研究

python基于逻辑回归的信用卡评分模型研究

文章目录 * 前言 * 一、项目介绍 * 二、功能介绍 * 三、核心代码 * 四、效果图 * 源码获取 前言 在金融行业中,信用卡评分模型是评估客户信用风险、辅助信贷决策的重要工具。逻辑回归作为一种经典的分类算法,因其实现简单、解释性强、预测性能稳定等优点,在信用卡评分领域得到了广泛应用。Python作为一种功能强大且易于上手的编程语言,结合其丰富的数据处理和机器学习库(如Pandas、Scikit-learn等),为构建基于逻辑回归的信用卡评分模型提供了有力支持。 一、项目介绍 开发语言:Python python框架:Django 软件版本:python3.7/python3.8 数据库:mysql 5.7或更高版本 数据库工具:Navicat11 开发软件:PyCharm/vs code 二、功能介绍 Python基于逻辑回归的信用卡评分模型研究,是利用Python编程语言结合逻辑回归算法,

By Ne0inhk
告别 Python 多版本环境冲突!Anaconda 虚拟环境实操指南

告别 Python 多版本环境冲突!Anaconda 虚拟环境实操指南

日常 Python 开发中,不少开发者都会遇到一个头疼的问题:不同项目依赖不同版本的 Python 解释器或第三方包,直接全局安装会导致版本覆盖、依赖不兼容,轻则命令执行失败,重则项目直接报错。本文就来拆解 Python 多版本环境冲突的根源,并给出新手也能轻松上手的解决方案 —— 用 Anaconda 打造隔离的虚拟环境。 一、为什么会出现多版本环境冲突? Python 环境冲突的核心根源很简单: * 全局环境只有一个,不同项目对 Python 版本(如 3.8、3.10)、第三方包版本(如 numpy 1.21、numpy 1.24)的需求不同; * 直接在全局环境安装 / 升级包,会覆盖原有版本,导致依赖旧版本的项目运行异常; * 手动管理多个 Python 安装包,不仅路径易混乱,环境变量配置也容易相互干扰。 举个常见场景:

By Ne0inhk