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

Swift 解 LeetCode 250:搞懂同值子树,用递归写出权限系统检查器

在这里插入图片描述
在这里插入图片描述

文章目录

    • 前言
    • 问题描述简单说:
    • 痛点分析:到底难在哪?
      • 1. 子树的概念搞不清楚
      • 2. 要不要“递归”?递归从哪开始?
      • 3. 怎么“边遍历边判断”?这套路不熟
    • 后序遍历 + 全局计数器
    • 遍历过程解释一下:
    • 和实际场景结合下:这题能学到啥?
      • 文件系统权限继承检查
      • 配置项一致性检查
    • 时间复杂度
    • 测试用例简单跑一下:
    • 最后的话

前言

你有没有碰到过这种情况:给你一棵二叉树,要求你找出其中所有“节点值都相同的子树”数量。第一次看到是不是有点懵?我当时就反应了一下:子树、节点值一样、还要统计数量……这到底要怎么下手?

今天我们就来聊聊这道 LeetCode 第 250 题《统计同值子树(Count Univalue Subtrees)》,顺便结合点实际开发中可能遇到的场景,看看这种题到底能学到什么有用的思维方式。

问题描述简单说:

给你一棵二叉树,统计里面有多少个子树,它的所有节点值都一样。

举个例子:

    5/ \1   5/ \   \
5   5   5

上面这个树中,有 4 个“同值子树”:最下面 3 个 5 叶子节点 + 右边那棵 5 -> 5 的子树。

痛点分析:到底难在哪?

这道题看起来像是一道“树的遍历”基础题,但实则不太好掌握。

1. 子树的概念搞不清楚

不少人一开始以为是“叶子节点”才叫子树,或者以为只有完整子结构才算。其实任意节点为根的结构都可以是子树。

2. 要不要“递归”?递归从哪开始?

树的问题很多时候都用递归,但递归是“从顶向下”还是“从底向上”?这题其实是要“从叶子往上走”,因为你得先知道左右子树是否满足条件,才能判断当前节点是不是一个“同值子树”。

3. 怎么“边遍历边判断”?这套路不熟

你不能等遍历完再判断,而是要在每次递归返回的时候就带点有用的信息,比如:是不是同值,是的话加一。

后序遍历 + 全局计数器

class TreeNode {var val: Intvar left: TreeNode?var right: TreeNode?init(_ val: Int) {self.val = val}
}class Solution {private var count = 0func countUnivalSubtrees(_ root: TreeNode?) -> Int {_ = isUnival(root)return count}private func isUnival(_ node: TreeNode?) -> Bool {guard let node = node else {return true // 空节点默认算同值子树}let leftIsUnival = isUnival(node.left)let rightIsUnival = isUnival(node.right)if !leftIsUnival || !rightIsUnival {return false}if let left = node.left, left.val != node.val {return false}if let right = node.right, right.val != node.val {return false}count += 1return true}
}

逻辑很简单:

  • 用一个 count 全局变量做计数器
  • 用一个递归函数 isUnival 判断某节点是不是“同值子树”
  • 每次判断成功就给计数器加一

遍历过程解释一下:

拿刚才的例子图来说:

       5/ \1   5/ \   \5   5   5

从最下面开始判断:

  • 左下两个 5 是叶子节点,肯定是同值子树
  • 1 的左右子树虽然都是 5,但跟自己不一样,所以不是
  • 右边的 5 -> 5 是同值
  • 整棵树不是,因为左子树不满足

最后统计出来就是 4 个。

和实际场景结合下:这题能学到啥?

说实话,单纯为了刷题记住这题的套路没啥意思。咱们可以想一想,在日常开发中,有没有遇到类似的结构需求?答案是:有。

文件系统权限继承检查

假设有一个多层级的文件目录结构,你想知道哪些文件夹中,所有子文件的权限都是一样的,这样就可以打包成一个统一模板。

  • 节点 = 文件夹
  • 节点值 = 权限值
  • 子树同值判断 = 检查子目录权限一致

配置项一致性检查

比如你有一个配置树,里面可能有很多子配置。如果你想找到哪些配置项完全一致(便于缓存或者合并),这种“统一值的结构识别”就是这个题的思路。

时间复杂度

这题的时间复杂度是 O(n),因为每个节点最多访问一次。

空间复杂度取决于树的深度,最坏情况是 O(n),也就是退化成链状结构的时候。

测试用例简单跑一下:

let root = TreeNode(5)
root.left = TreeNode(1)
root.right = TreeNode(5)
root.left?.left = TreeNode(5)
root.left?.right = TreeNode(5)
root.right?.right = TreeNode(5)let solution = Solution()
print(solution.countUnivalSubtrees(root)) // 输出 4

最后的话

这题虽然在 LeetCode 上是 Easy 难度,但实际含金量挺高:你需要掌握“自底向上的遍历”、要会在递归中携带和判断状态、还要理解“结构是否满足条件”的整体判断。

如果你刷题是为了实战开发的思维训练,这种题一定不能只做一遍就忘了,建议把它变成一张图,标出每个节点是否是同值子树,再动手实现一遍。

相关文章:

Swift 解 LeetCode 250:搞懂同值子树,用递归写出权限系统检查器

文章目录 前言问题描述简单说:痛点分析:到底难在哪?1. 子树的概念搞不清楚2. 要不要“递归”?递归从哪开始?3. 怎么“边遍历边判断”?这套路不熟 后序遍历 全局计数器遍历过程解释一下:和实际场…...

Nginx搭建API网关服务教程-系统架构优化 API统一管理

超实用!用Nginx搭建API网关服务,让你的系统架构更稳更强大!🚀 亲们,今天来给大家种草一个超级实用的API网关搭建方案啦!👀 在如今的Web系统架构中,一个稳定、高性能、可扩展的API网…...

SQL2API是什么?SQL2API与BI为何对数据仓库至关重要?

目录 一、SQL2API是什么? 二、SQL2API的历史演变:从数据共享到服务化革命 1990年代:萌芽于数据仓库的数据共享需求 2010年代初:数据中台推动服务化浪潮 2022年左右:DaaS平台的兴起 2025年代:麦聪定义…...

CentOS 7无法上网问题解决

CentOS 7无法上网问题解决 问题 配置了桥接模式以后,能够ping通本地IP但是无法ping通www.baidu.com 这里的前提是VWare上已经对虚拟机桥接模式网卡做了正确的选择,比如我现在选择的就是当前能够上外网的网卡: 问题根因 DNS未正确配置。…...

优化 Web 性能:使用 WebP 图片(Uses WebP Images)

在 Web 开发中,图片资源的优化是提升页面加载速度和用户体验的关键。Google 的 Lighthouse 工具在性能审计中特别推荐“使用 WebP 图片”(Uses WebP Images),因为 WebP 格式在保持视觉质量的同时显著减少文件大小。本文将基于 Chr…...

SQL121 创建索引

-- 普通索引 CREATE INDEX idx_duration ON examination_info(duration);-- 唯一索引 CREATE UNIQUE INDEX uniq_idx_exam_id ON examination_info(exam_id);-- 全文索引 CREATE FULLTEXT INDEX full_idx_tag ON examination_info(tag);描述 现有一张试卷信息表examination_in…...

Leetcode - 周赛443

目录 一、3502. 到达每个位置的最小费用二、3503. 子字符串连接后的最长回文串 I三、3504. 子字符串连接后的最长回文串 II四、3505. 使 K 个子数组内元素相等的最少操作数 一、3502. 到达每个位置的最小费用 题目链接 本题是一道脑筋急转弯,实际就是计算前缀最小…...

dolphinscheduler单机部署链接oracle

部署成功请给小编一个赞或者收藏激励小编 1、安装准备 JDK版本:1.8或者1.8oracle版本:19Coracle驱动版本:8 2、安装jdk 下载地址:https://www.oracle.com/java/technologies/downloads/#java8 下载后上传到/tmp目录下。 然后执行下面命…...

Three.js 系列专题 5:加载外部模型

内容概述 Three.js 支持加载多种 3D 文件格式(如 GLTF、OBJ、FBX),这让开发者可以直接使用专业建模软件(如 Blender、Maya)创建的复杂模型。本专题将重点介绍 GLTF 格式的加载,并调整模型的位置和材质。 学习目标 理解常见 3D 文件格式及其特点。掌握使用 GLTFLoader 加…...

【C++算法】50.分治_归并_翻转对

文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 493. 翻转对 题目描述: 解法 分治 策略一:计算当前元素cur1后面,有多少元素的两倍比我cur1小(降序) 利用单…...

观察者模式详解实战

观察者模式深度解析与实战案例 一、传统观察者模式痛点分析 强制接收所有通知:观察者被迫处理无关事件 事件信息不透明:状态变更缺乏上下文信息 类型安全缺失:需要手动进行类型判断和转换 扩展成本高:新增事件类型需要修改接口 …...

Light RPC:一款轻量高效的Java RPC框架实践指南

Light RPC:一款轻量高效的Java RPC框架实践指南 一、框架简介二、快速入门1. 环境准备2. 服务端配置2.1 添加依赖2.2 YAML配置2.3 接口与实现 3. 客户端配置3.1 添加依赖3.2 YAML配置3.3 客户端调用 三、核心设计解析四、适用场景与优势对比五、总结 一、框架简介 …...

国内MCP资源网站有哪些?MCP工具上哪找?

在人工智能领域,MCP(模型上下文协议)正逐渐成为连接 AI 模型与外部世界的重要桥梁。而AIbase (https://www.aibase.com/zh/repos/topic/mcp)正是探索 MCP 生态的绝佳平台,它为开发者和研究者提供了一个集中…...

在PowerBI中通过比较日期实现累加计算

#表格数据# 日期数量2025/4/712025/4/822025/4/932025/4/1042025/4/1152025/4/1262025/4/1372025/4/1482025/4/1592025/4/16102025/4/1711 #新建计算列# 列 SUMX(FILTER(表格数据,[日期]<EARLIER([日期])),表格数据[数量])...

十四届蓝桥杯Java省赛 B组(持续更新..)

十四届蓝桥杯Java省赛 B组 第一题&#xff1a;阶乘求和 &#x1f4d6; &#x1f4da;阶乘求和 第二题&#xff1a;幸运数字 &#x1f4d6; &#x1f4da;幸运数字 第三题&#xff1a;数组分割 &#x1f4d6; &#x1f4da;数组分割 说是考动态规划&#xff0c;但没有用…...

NO.73十六届蓝桥杯备战|搜索算法-剪枝与优化-记忆化搜索|数的划分|小猫爬山|斐波那契数|Function|天下第一|滑雪(C++)

剪枝与优化 剪枝&#xff0c;形象得看&#xff0c;就是剪掉搜索树的分⽀&#xff0c;从⽽减⼩搜索树的规模&#xff0c;排除掉搜索树中没有必要的分⽀&#xff0c;优化时间复杂度。 在深度优先遍历中&#xff0c;有⼏种常⻅的剪枝⽅法 排除等效冗余 如果在搜索过程中&#xf…...

深度学习总结(2)

神经网络的数据表示 在前面的例子中,我们的数据存储在多维NumPy数组中,也叫作张量(tensor)​。一般来说,目前所有机器学习系统都使用张量作为基本数据结构。张量对这个领域非常重要,重要到TensorFlow都以它来命名。究竟什么是张量呢?张量这一概念的核心在于,它是一个数…...

STM32H7 ADC最大速率

STM32H7 ADC最大速率 硬件限制 封装 在手册 AN5354 中说明了不同封装、不同分辨率的最大速率是不一致的&#xff1b; BGA封装的ADC的速度要快于LQFP封装的速度的&#xff1b; 分辨位数越高、转换时间越长&#xff0c;所以ADC的最大采样速率也就最低&#xff1b; ADC通道模…...

MVC模型

MVC模型&#xff08;Model模型&#xff0c;View视图&#xff0c;Controller控制器&#xff09; 逻辑执行流程&#xff1a; JSP&#xff08;View&#xff09;----》Servlet&#xff08;Controller&#xff09;----》service&#xff0c;dao&#xff0c;pojo&#xff08;Model&a…...

OpenGL ES -> SurfaceView + EGL实现立方体纹理贴图+透视效果

XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MySurfaceView xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…...

arthas线上不停机修改bug

安装arthas wget https://alibaba.github.io/arthas/arthas-boot.jar启动&#xff1a; java -jar arthas-boot.jar 启动失败 使用jps也没查到对应的进程 发生错误信息 使用进程id启动&#xff0c;报错 进程id查看使用命令&#xff1a; ps -ef | grep java 详情&#xf…...

#关于require 与 import 相关了解

&#x1f4e6; require 在前端项目中使用&#xff0c;属于 CommonJS 模块规范 的语法&#xff0c;主要用于 Node.js 环境。早期的前端模块打包工具&#xff08;如 Webpack&#xff09;会兼容这种写法&#xff0c;但在现代前端项目&#xff08;如 Vue、React&#xff09;中&…...

【算法应用】基于融合A星-粒子群算法求解六边形栅格地图路径规划

目录 1.粒子群算法PSO原理2.结果展示3.参考文献4.代码获取 1.粒子群算法PSO原理 【智能算法】粒子群算法&#xff08;PSO&#xff09;原理及实现 六边形栅格地图 分析一下地图&#xff1a; 六边形栅格地图上移动可以看做6领域运动&#xff0c;偶数列与奇数列移动方式有所差异…...

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3源码整体结构解析

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3源码整体结构解析 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3源码整体结构解析前言代码结构整体data文件结构模型训练超参数配置文件解析数据集配置文件解析 models文件结构utils文件结构runs文…...

R语言:气象水文领域的数据分析与绘图利器

R 语言是一门由统计学家开发的用于统计计算和作图的语言&#xff08;a Statistic Language developed for Statistic by Statistician&#xff09;&#xff0c;由 S 语言发展而来&#xff0c;以统计分析功能见长。R 软件是一款集成 了数据操作、统计和可视化功能的优秀的开源软…...

R语言空间水文气象数据分析:从插值到动态可视化

一、R简介与R 在气象水文中的应用 R语言与 R软件简介R 在各行业的应用概览R 与其他语言的比较及其在数据分析与作图上的优势 R 在地学中的应用以及R 在气象水文中的应用 二、出发之前——用什么来同时记录我们的数据、代码及结果——Rmd与 knitr介绍 介绍一种方便的理念——…...

在Unity中实现《幽灵行者》风格的跑酷动作

基础设置 角色控制器选择&#xff1a; 使用Character Controller组件或Rigidbody Capsule Collider 推荐使用Character Controller以获得更精确的运动控制 输入系统&#xff1a; 使用Unity的新输入系统(Input System Package)处理玩家输入 滑铲实现 public class Slide…...

C# Winform 入门(14)之如何使用线程池

什么是线程&#xff1f; 首先我们要弄明白什么是线程&#xff0c;线程和线程池有啥区别&#xff1f; C# 多线程应用(同步异步)_c# 异步线程-CSDN博客 补充&#xff1a;ManualResetEvent 的使用 ManualResetEvent 是一种线程同步机制&#xff0c;用于控制一个或者多个线程的执…...

I have something to say about Vue Node.js

关于Vue Node.js&#xff0c;我真的说了很多次了&#xff0c;让我难以理解为啥这么粗糙的东西能流行一起。真疯狂的世界。 vue让感觉就像玩猫德一样的&#xff0c;如此的疯狂&#xff0c;天哪。睡觉了 Node.js v13 window7_nodejsv13-CSDN博客...

OpenCV 图形API(17)计算输入矩阵 src 中每个元素的平方根函数sqrt()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 计算数组元素的平方根。 cv::gapi::sqrt 函数计算每个输入数组元素的平方根。对于多通道数组&#xff0c;每个通道会独立处理。其精度大约与内置的 …...

题目练习之set的奇妙使用

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

基于人工智能的医学影像关联分析:利用潜在空间几何混杂因素校正法|文献速递-深度学习医疗AI最新文献

Title 题目 AI-based association analysis for medical imaging using latent-spacegeometric confounder correction 基于人工智能的医学影像关联分析&#xff1a;利用潜在空间几何混杂因素校正法 01 文献速递介绍 人工智能&#xff08;AI&#xff09;已成为各个领域的…...

进程的创建态、运行状态和阻塞状态

今天与大家来聊聊进程的三种状态&#xff1a; 1. 创建态 当需要创建一个新进程时&#xff0c;系统为该进程分配一个进程控制块 PCB&#xff0c;并为该进程分配内存空间&#xff0c;且装入该进程对应的程序和有关的数据&#xff0c;这时&#xff0c;一个新进程就产生了。 2. …...

科普:GRU、LSTM及RNN

GRU&#xff08;门控循环单元&#xff09;、LSTM&#xff08;长短期记忆网络&#xff09;、RNN&#xff08;循环神经网络&#xff09;均为处理序列数据的神经网络模型&#xff0c;它们之间存在着紧密的联系与明显的差异。 我们重点看一下GRU&#xff0c;并比较它们。 一、GRU算…...

java+postgresql+swagger-多表关联insert操作(七)

入参为json&#xff0c;然后根据需要对多张表进行操作&#xff1a; 入参格式&#xff1a; [{"custstoreName":"swagger-测试经销商01","customerName":"swagger-测试客户01","propertyNo":"swaggertest01",&quo…...

如何将/dev/ubuntu-vg/lv-data的空间扩展到/dev/ubuntu-vg/ubuntu-lv的空间上

要将 /dev/ubuntu-vg/lv-data 的空间扩展到 /dev/ubuntu-vg/ubuntu-lv 上&#xff0c;实际上是将 lv-data 的空间释放出来&#xff0c;并将其分配给 ubuntu-lv。以下是详细的步骤和操作说明&#xff1a; 已知信息 你有两个逻辑卷&#xff1a; /dev/ubuntu-vg/lv-data/dev/ubun…...

No module named ‘keras.engine‘

目录 报错代码&#xff1a; tensorflow-gpu安装 2024.01.05 keras和tf版本对应关系&#xff1a; 报错代码&#xff1a; try:from keras.src.engine import base_layer, data_adapterfrom keras.src.engine.training import _disallow_inside_tf_function, _get_verbosity, …...

python应用之使用pdfplumber 解析pdf文件内容

目录标题 1. 通过 pdfplumber.open() 解析复杂PDF&#xff1a;1-2. 报错&#xff1a;V2 &#xff1a; v3 使用tk 库运行环境准备完整代码保存运行测试步骤方式二&#xff1a;命令行方式&#xff08;适用于自动化&#xff09; 测试用例示例常见问题排查1. 无文件选择对话框弹出&…...

【学Rust写CAD】36 颜色插值函数(alpha256.rs补充方法)

源码 pub fn alpha_lerp(self,src: Argb, dst: Argb, clip: u32) -> Argb {self.alpha_mul_256(clip).lerp(src, dst)}这个函数 alpha_lerp 是一个颜色插值&#xff08;线性插值&#xff0c;lerp&#xff09;函数&#xff0c;它结合了透明度混合&#xff08;alpha_mul_256&…...

[GN] 通讯协议 - Uart

系列文章目录 sigrokdecode 模块学习指南 — 准备阶段 文章目录 系列文章目录前言通讯协议Uart通讯协议什么是UartUART通信协议 其他协议后续待更 前言 在阅读libsigrokdecode源码之前&#xff0c;先学习通讯协议。so hard&#xff01;&#xff01; 通讯协议 Uart通讯协议 …...

C# 状态模式深度解析:构建灵活的状态驱动系统

一、状态模式概述 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为&#xff0c;使对象看起来像是修改了它的类。这种模式将特定状态相关的行为局部化&#xff0c;并且将不同状态的行为分割开来。 状态…...

MySQL学习笔记四

第六章过滤数据 6.1使用WHERE子句 输入&#xff1a; SELECT job_id, job_title FROM jobs WHERE min_salary4200; 输出&#xff1a; 说明&#xff1a;在需要特定数据时需要根据条件对数据库中的数据进行过滤&#xff0c;即指定搜索条件&#xff08;过滤条件&#xff09;&a…...

Node环境安装

1.下载安装 作为开发使用&#xff0c;追求长期运行的Node环境&#xff0c;建议选择LTS版本(长期支持稳定版)&#xff0c;本地测试可以选择最新版本。首先&#xff0c;访问Node.js官网下载安装程序&#xff0c;好在官网默认就有下载链接&#xff1a; 直接点击下载即可&#xff…...

浏览器自动化操作AI工具-browser-use

一、项目概述 Browser-Use 是一个将大型语言模型&#xff08;LLM&#xff09;与浏览器自动化结合的开源工具&#xff0c;旨在通过AI代理实现智能化的网页交互操作。其核心目标是为开发者提供一种无需编写复杂脚本即可完成网页自动化任务的解决方案&#xff0c;支持从数据抓取到…...

极氪汽车云原生架构落地实践

云原生架构落地实践的背景 随着极氪数字业务的飞速发展&#xff0c;背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验&#xff0c;并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。 为快速响应用户的需求&#xff0c;例如…...

[ctfshow web入门] web16

信息收集 提示&#xff1a;对于测试用的探针&#xff0c;使用完毕后要及时删除&#xff0c;可能会造成信息泄露 试试url/phpinfo.php url/phpsysinfo.php url/tz.php tz.php能用 点击phpinfo&#xff0c;查看phpinfo信息&#xff0c;搜索flag&#xff0c;发现flag被保存为变量…...

沧州铁狮子

又名“镇海吼”&#xff0c;是中国现存年代最久、形体最大的铸铁狮子&#xff0c;具有深厚的历史文化底蕴和独特的艺术价值。以下是关于沧州铁狮子的详细介绍&#xff1a; 历史背景 • 铸造年代&#xff1a;沧州铁狮子铸造于后周广顺三年&#xff08;953年&#xff09;&#…...

【Android Sdk】uiautomatorviewer.bats闪退问题如何解决?

目录 一、uiautomatorviewer.bats闪退 1. 报错场景 2. 问题原因 3. 解决方法 前言 具体操作 一、uiautomatorviewer.bats闪退 1. 报错场景 SDK的tools文件夹中uiautomatorviewer.bat双击闪退不能打开&#xff0c;直接双击uiautomatorviewer.bat闪退。 双击打不开uiaut…...

Redis7——进阶篇(八)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…...

蓝桥杯 封闭图形个数 刷题笔记

分析 写一个node结构 定义两个数一个存数值 一个存图形个数 分解每个输入的数 的每一位 为每个输入的数赋值一个封闭图形个数的值作为判断依据 重写 cmp函数作为 sort的判断依据 #include<iostream> #include<bits/stdc.h> using namespace std; const int N…...