当前位置: 首页 > news >正文

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝

大佬们好呀,这一次讲解的是二叉树的深度搜索,大佬们请阅

1.前言

⼆叉树中的深搜(介绍)

深度优先遍历(DFS,全称为DepthFirstTraversal),是我们树或者图这样的数据结构中常⽤的⼀种***遍历算法***。这个算法会尽可能深的搜索树或者图的分⽀,直到⼀条路径上的所有节点都被遍历完毕,然后再回溯到上⼀层,继续找⼀条路遍历。
在⼆叉树中,常⻅的深度优先遍历为:前序遍历中序遍历以及后序遍历
因为树的定义本⾝就是递归定义,因此采⽤递归的⽅法去实现树的三种遍历不仅容易理解⽽且代码很简洁。并且前中后序三种遍历的唯⼀区别就是 ***访问根节点的时机不同***,在做题的时候,选择⼀个适当的遍历顺序,对于算法的理解是⾮常有帮助的。

好了,接下来让我们用习题来介绍吧

1.计算布尔⼆叉树的值(medium)

题目链接:计算布尔二叉树的值
题目介绍:

给你⼀棵完整⼆叉树的根,这棵树有以下特征:
叶⼦节点要么值为0要么值为1,其中0表⽰False,1表⽰True。
⾮叶⼦节点要么值为2要么值为3,其中2表⽰逻辑或OR,3表⽰逻辑与AND。
计算⼀个节点的值⽅式如下:
如果节点是个叶⼦节点,那么节点的值为它本⾝,即True或者False。
否则,计算两个孩⼦的节点值,然后将该节点的运算符对两个孩⼦值进⾏运算。
返回根节点root的布尔运算值。
完整⼆叉树是每个节点有0个或者2个孩⼦的⼆叉树。
叶⼦节点是没有孩⼦的节点。

在这里插入图片描述

算法思路:

    1. 对于规模为n的问题,需要求得当前节点值。
    1. 节点值不为0或1时, ***规模为n的问题可以被拆分为规模为n-1的⼦问题***:
  • a:所有⼦节点的值;
  • b:通过⼦节点的值运算出当前节点值。
    1. 当问题的规模变为n=1时,即叶⼦节点的值为0或1,我们可以直接获取当前节点值为0或1。

递归函数流程:

    1. 当前问题规模为n=1时,即叶⼦节点,直接返回当前节点值
    1. 递归求得左右⼦节点的值;
    1. 通过***判断当前节点的逻辑运算符***,计算左右⼦节点值运算得出的结果;

代码如下:

class Solution {
public:bool evaluateTree(TreeNode* root) {if(root->left==nullptr||root->right==nullptr){return root->val;}else{if(root->val==2)return evaluateTree(root->left)||evaluateTree(root->right);elsereturn evaluateTree(root->left)&&evaluateTree(root->right);}}
};

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

题目链接:求根节点到叶节点数字之和
题目介绍:
给你⼀个⼆叉树的根节点root,树中每个节点都存放有⼀个0到9之间的数字。
每条从根节点到叶节点的路径都代表⼀个数字:
例如,从根节点到叶节点的路径1->2->3表⽰数字123。
计算从根节点到叶节点⽣成的所有数字之和。
叶节点是指没有⼦节点的节点。

在这里插入图片描述
解题思路:

解法(dfs-前序遍历)

前序遍历按照根节点、左⼦树、右⼦树的顺序遍历⼆叉树的所有节点,通常⽤于 ⼦节点的状态依赖于⽗节点状态的题⽬

在前序遍历的过程中,我们可以 往左右⼦树传递信息,并且在回溯时得到左右⼦树的返回值。递归函数可以帮我们完成两件事:

  • 将⽗节点的数字与当前节点的信息整合到⼀起,计算出当前节点的数字,然后传递到下⼀层进⾏递归;
  • 当遇到叶⼦节点的时候,就***不再向下传递信息***,⽽是 ***将整合的结果向上⼀直回溯到根节点***。在递归结束时,根节点需要返回的值也就被更新为了整棵树的数字和。

递归函数流程:

    1. 当遇到空节点的时候,说明这条路从根节点开始没有分⽀,返回0
    1. 结合⽗节点传下的信息以及当前节点的val,计算出当前节点数字sum
    1. 如果当前结点是叶⼦节点,直接返回整合后的结果sum
    1. 如果当前结点不是叶⼦节点,将sum传到左右⼦树中去得到左右⼦树中节点路径的数字和,然后 ***相加后返回结果***。

代码如下:

class Solution {
public:int sumNumbers(TreeNode* root) {return sumNumber(root,0);}int sumNumber(TreeNode* root,int x) {if(root==nullptr)return x;else{x=x*10+root->val;}if(root->left!=nullptr&&root->right!=nullptr)return sumNumber(root->left,x)+sumNumber(root->right,x);else if(root->left!=nullptr)return sumNumber(root->left,x);else if(root->right!=nullptr)return sumNumber(root->right,x);elsereturn x;}
};

3.⼆叉树剪枝(medium)

题⽬链接:二叉树剪枝

题目介绍:

给你⼆叉树的根结点root,此外树的每个结点的值要么是0,要么是1。
返回移除了所有不包含1的⼦树的原⼆叉树。
节点node的⼦树为node本⾝加上所有node的后代。

在这里插入图片描述
解法(dfs-后序遍历):
后序遍历按照左⼦树、右⼦树、根节点的顺序遍历⼆叉树的所有节点,通常⽤于 ⽗节点的状态依赖于⼦节点状态的题⽬

后序遍历的主要流程:

    1. 递归出⼝:当传⼊节点为空时,不做任何处理;
    1. 递归处理***左⼦树***;
    1. 递归处理***右⼦树***;
    1. 处理当前节点:判断该节点是否为叶⼦节点(即左右⼦节点均被删除,前点成为叶⼦节点),并且节点的值为0
      a. 如果是,就删除掉;
      b. 如果不是,就不做任何处理

代码如下:

class Solution {
public:TreeNode* pruneTree(TreeNode* root) {dfs(root);if(root->left==nullptr&&root->right==nullptr&&root->val==0)return nullptr;elsereturn root;}bool dfs(TreeNode* root) {if (root) {if(root->left==nullptr&&root->right==nullptr)return root->val;bool l = dfs(root->left);bool r = dfs(root->right);if (l == false) {root->left = nullptr;}if (r == false) {root->right = nullptr;}if(root->val==0)return l || r;elsereturn 1;}elsereturn false;}
};

4. ⼆叉搜索树中第k⼩的元素(medium)

题目链接:⼆叉搜索树中第k⼩的元素

题目描述:
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。

在这里插入图片描述
解题思路:
(中序遍历+计数器剪枝)
上述解法不仅使⽤⼤量额外空间存储数据,并且会将所有的结点都遍历⼀遍。
但是,我们可以根据中序遍历的过程,只需扫描前k个结点即可。
因此,我们可以创建⼀个全局的计数器***count***,将其初始化为***k***,每遍历⼀个节点就将***count–***。直到某次递归的时候,count的值等于0,说明此时的结点就是我们要找的结果。

代码如下:

class Solution {
public:int kthSmallest(TreeNode* root, int k) {int flag = 0;dfs(root, k, flag);return flag;}void dfs(TreeNode* root, int& k, int& flag) {if (root) {dfs(root->left, k, flag);k--;if (k == 0) {flag = root->val;}dfs(root->right, k, flag);}}
};

好啦,递归问题就讲到这里,下一次讲解的是搜索,回溯和全排列,我们下次再见

相关文章:

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝

大佬们好呀,这一次讲解的是二叉树的深度搜索,大佬们请阅 1.前言 ⼆叉树中的深搜(介绍) 深度优先遍历(DFS,全称为DepthFirstTraversal),是我们树或者图这样的数据结构中常⽤的⼀种…...

编写第一个 Appium 测试脚本:从安装到运行!

前言 最近接到一个测试项目,简单描述一下,需求就是:一端发送指令,另一端接受指令并处理指令。大概看了看有上百条指令,点点点岂不是废了,而且后期迭代,每次都需要点点点,想想就头大…...

mysql查表相关练习

作业要求: 单表练习: 1 . 查询出部门编号为 D2019060011 的所有员工 2 . 所有财务总监的姓名、编号和部门编号。 3 . 找出奖金高于工资的员工。 4 . 找出奖金高于工资 40% 的员工。 5 找出部门编号为 D2019090011 中所有财务总监,和…...

airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告

一:主要内容 框架功能、框架架构及测试报告效果 airtest安装、环境搭建 框架搭建、框架运行说明 框架源码 二:框架功能及测试报告效果 1. 框架功能: 该框架笔者用来作为公司的项目的前端自动化,支持pc和app,本文…...

Prometheus套装部署到K8S+Dashboard部署详解

1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…...

python使用pymysql

为了封装这个数据库操作为一个通用方法,我们可以创建一个函数,该函数接受数据库连接参数(如主机名、用户名、密码、数据库名)、SQL语句以及必要的参数(用于参数化查询)。下面是一个简单的封装示例&#xff…...

Vue3 + TypeScript 组件和文件命名规范及 setup 导入顺序规范

前言 在 Vue3 项目中,合理的文件命名规范和导入顺序不仅有助于提高代码的可读性,还能增强团队协作的效率。特别是在使用 TypeScript 和 Composition API 的项目中,清晰的组件和文件结构尤为重要。本文将详细介绍 Vue3 TypeScript 项目中的组…...

netty之处理连接源码分析

写在前面 在这篇文章看了netty服务是如何启动的,服务启动成功后,也就相当于是迎宾工作都已经准备好了,那么当客人来了怎么招待客人呢?也就是本文要看的处理连接的工作。 1:正文 先启动源码example模块的echoserver&a…...

Dockerfile文件编写

1、打nginx原始包 登录后复制 ROM nginxENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 ENV TZ Asia/Singapore# 设置时区,同样保持在一层 RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \echo "${TZ}" > /etc/timezoneRUN apt-get …...

Oracle SQL 使用 ROWNUM 分页查询速度太慢的问题及解决方案!

在使用 Oracle 数据库进行数据查询时,分页查询是一种常见的需求。传统上,开发者常常使用 ROWNUM 来实现分页功能。 然而,当数据量较大时,使用 ROWNUM 进行分页查询可能会导致性能问题。本文将深入探讨这一问题的原因,并提供多种解决方案,以提高分页查询的性能。 一、RO…...

Django3 + Vue.js 前后端分离书籍添加项目Web开发实战

文章目录 Django3后端项目创建切换数据库创建Django实战项目App新建Vue.js前端项目 Django3后端项目创建 创建Django项目,采用Pycharm或者命令行创建皆可。此处,以命令行方式作为演示,项目名为django_vue。 django-admin startproject djang…...

楼梯区域分割系统:Web效果惊艳

楼梯区域分割系统源码&数据集分享 [yolov8-seg-FocalModulation&yolov8-seg-GFPN等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…...

Day10加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 class Solution {public int[] plusOne(int[] di…...

UTF-8简介

UTF-8 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码,属于Unicode标准的一部分,最初由肯汤普逊…...

基于Openwrt系统架构,实现应用与驱动的实例。

一、在openwrt系统架构,编写helloworld的应用程序。 第一步先创建目录,项目代码要放在 openwrt根目下的 package 目录中,这里源码写在了 hellworld 的 src 目录下,因为外层还有需要编写的文件。 mkdir -p ~/openwrt/package/hel…...

SQL进阶技巧:如何利用三次指数平滑模型预测商品零售额?

目录 0 问题背景 1 数据准备 2 问题解决 2.1 模型构建 (1)符号规定 (2)基本假设...

HTB:Cicada[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行开放端口扫描 使用nmap对靶机开放端口进行脚本、服务信息扫描 首先尝试空密码连接靶机SMB服务 由于不知道账户名,这里我们使用crackmapexec对smb服务进行用户爆破 通过该账户连接至靶机SMB服务器提取敏感信…...

小张求职记四

学校食堂的装修富丽堂皇,像个金碧辉煌的宫殿,可实际上却充斥着廉价的塑料制品和刺鼻的消毒水味。这金玉其外败絮其中的景象,与食堂承包商的“精明算计”如出一辙。 小张和小丽应约来到了一个档口下,“红烧肉”,之前就是…...

适用于 c++ 的 wxWidgets框架源码编译SDK-windows篇

本文章记录了下载wxWidgets源码在windows 11上使用visual Studio 2022编译的全过程,讲的不详细请给我留言,让我知道错误并改进。 本教程是入门级。有更深入的交流可以留言给我。 如今互联网流行现在大家都忘记了这块桌面的开发,我认为桌面应用还是有用武之地,是WEB无法替代…...

flink 内存配置(二):设置TaskManager内存

TaskManager在Flink中运行用户代码。根据需要配置内存使用,可以极大地减少Flink的资源占用,提高作业的稳定性。 注意下面的讲解适用于TaskManager 1.10之后的版本。与JobManager进程的内存模型相比,TaskManager内存组件具有类似但更复杂的结构…...

作业本耐用度差距巨大?深圳大明印刷厂拆解合规工艺,告别定制作业本掉页开裂通病

在校园日常教学中,很多学校都会遇到同一个难题:同一学期采购的作业本、定制作业本,品质差距悬殊,有的完好无损用到期末,有的短短几周就出现书脊开裂、页面脱落、边角破损、翻页卡顿等问题。不少人误以为是学生使用习惯…...

诚信标签工厂端解决方案 适配俄标 CRPT 体系一体化技术方案

俄罗斯诚实标签依托 CRPT 体系执行强制管控,各类出口货品必须完成 Data Matrix 编码采集、格式转换、多层包装数据绑定,数据合规后方可通关流通。美妆食品、日化建材、玩具五金等品类包装形态差异较大,人工采集方式普遍存在识别精度不足、批量…...

亚马逊卖家公开信息数据提取:反爬攻防战与 Python 批量采集实战

摘要: 批量获取亚马逊(Amazon)第三方卖家的商业名称、信用代码和注册地址等信息,对于跨境 B2B 拓客和供应链分析具有重要意义。然而,亚马逊的 Cloudflare 盾和 Robot 验证码构成了极高的反爬门槛。本文将深度解析亚马逊…...

终极鼠标连点器使用指南:3分钟掌握高效自动化技巧

终极鼠标连点器使用指南:3分钟掌握高效自动化技巧 【免费下载链接】MouseClick 🖱️ MouseClick 🖱️ 是一款功能强大的鼠标连点器和管理工具,采用 QT Widget 开发 ,具备跨平台兼容性 。软件界面美观 ,操作…...

Claude端到端测试设计:从零搭建可审计、可回放、可量化的AI服务测试流水线(含开源Schema校验工具)

更多请点击: https://codechina.net 第一章:Claude端到端测试设计 端到端测试是验证Claude模型在真实用户交互链路中行为一致性的关键手段。它覆盖从原始提示输入、上下文管理、流式响应生成,到输出解析与业务校验的全路径,确保模…...

C++ vector容器总结

vector基本概念功能:vector数据结构和数组非常相似,也称为单端数组vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间&a…...

收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备

如今人工智能早已脱离概念炒作阶段,全面扎根企业实际业务场景,成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道,行业心态也从初期观望试探,彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...

Claude SWOT分析(内部风控文档流出版):3类高危使用场景+2个监管红线预警

更多请点击: https://intelliparadigm.com 第一章:Claude SWOT分析(内部风控文档流出版):3类高危使用场景2个监管红线预警 高危使用场景识别 在企业级AI应用中,Claude模型若未经严格风控适配,…...

【2025】AWVS安装保姆级教程(最新25.1.2可用)

【2025】AWVS安装保姆级教程(最新25.1.2可用) 文章目录 工具下载Host 重定向AWVS安装AWVS查看安装失败原因 工具下载 点击下载即可 下载完的工具后缀格式为.apk,需要将其改为.zip,然后将其解压得到以下工具后续安装使用 Host 重…...

JWT弱密钥爆破实战:从HS256签名原理到CTF权限提升

1. 这不是密码学考试,而是一场“密钥猜谜”实战JWT(JSON Web Token)在现代Web系统中早已不是可选项,而是默认配置。登录成功后返回一串形如eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsIm5hbWUiOiLnlKjliYkiLCJpYX…...