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

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路

文章目录

  • 计算布尔二叉树的值
  • 求根节点到叶节点的数字之和
  • 二叉树剪枝
  • 验证二叉搜索树
  • 二叉搜索树中第K小的元素
  • 二叉树的所有路径

计算布尔二叉树的值

解题思路:

  • 这是一个二叉树的布尔评估问题。树的每个节点包含一个值,其中叶子节点值为 0 或 1,非叶子节点值为 2(表示 OR 操作)或 3(表示 AND 操作)。
    可以使用递归来评估布尔树:
    如果当前节点是叶子节点,直接返回其布尔值(0 为 False,1 为 True)。
    否则,递归评估左右子树。
    如果当前节点值为 2,返回左右子树的“或”运算结果;如果为 3,返回“与”运算结果。

在这里插入图片描述

class Solution 
{
public:bool evaluateTree(TreeNode* root) {// 如果是叶节点,返回节点值的布尔结果if(root->left == nullptr) return root->val == 0 ? false : true;// 递归计算左子树的布尔值auto left = evaluateTree(root->left);// 递归计算右子树的布尔值auto right = evaluateTree(root->right);// 根据节点值来决定使用哪种布尔运算// 2 表示 OR 运算,3 表示 AND 运算return root->val == 2 ? left | right : left & right;    }
};

求根节点到叶节点的数字之和

解题思路:

  • 要计算从根节点到叶节点路径所表示的所有数字的总和。
    递归遍历每条路径,沿途维护一个当前的数字值,将每个节点的值添加到数字的末尾。
    如果到达叶子节点,将当前生成的数字添加到总和中。
    返回所有根到叶路径数字的总和。

在这里插入图片描述

class Solution 
{
public:// 主函数,调用辅助的深度优先搜索函数,初始累加和为0int sumNumbers(TreeNode* root) {return dfs(root, 0);}// 深度优先搜索函数,用于计算从根到叶节点的路径和int dfs(TreeNode* root, int presum){// 将当前节点的值加入路径值,乘以10以表示其位数presum = presum * 10 + root->val;// 如果当前节点是叶节点,直接返回累加的路径和if (root->left == nullptr && root->right == nullptr) return presum;int ret = 0;// 递归处理左子树,并累加路径和if (root->left) ret += dfs(root->left, presum);// 递归处理右子树,并累加路径和if (root->right) ret += dfs(root->right, presum);// 返回累加的路径和return ret;}
};

二叉树剪枝

解题思路:

  • 需要剪除二叉树中所有的子树,如果整个子树中没有 1,就删除该子树。
    可以使用后序遍历递归判断每个节点的左右子树:
    先递归处理左子树和右子树。
    如果左子树没有 1,则将左子树置为 None;如果右子树没有 1,则将右子树置为 None。
    最后,判断当前节点是否为 1 或其子树是否包含 1,如果都没有,返回 None,否则返回当前节点。

在这里插入图片描述

class Solution 
{
public:// 主函数,调用递归函数修剪二叉树TreeNode* pruneTree(TreeNode* root) {// 如果节点为空,直接返回空if (root == nullptr) return nullptr;// 递归处理左子树和右子树root->left = pruneTree(root->left);root->right = pruneTree(root->right);// 如果当前节点的值为0,且左右子树均为空,删除当前节点(设为nullptr)if (root->left == nullptr && root->right == nullptr && root->val == 0){root = nullptr;}// 返回处理后的节点return root;}
};

验证二叉搜索树

解题思路:

  • 验证二叉树是否为二叉搜索树(BST),即所有左子树节点值均小于当前节点,所有右子树节点值均大于当前节点。
    可以通过递归设定上下边界来验证每个节点:
    对于根节点,其值在 (−∞, +∞) 范围内。
    对于左子节点,设定其值范围为 (min, 当前节点值)。
    对于右子节点,设定其值范围为 (当前节点值, max)。
    如果所有节点都符合条件,则该树是 BST。

在这里插入图片描述

class Solution 
{long prev = LONG_MIN; // 用于记录前一个节点的值,初始为最小值
public:// 验证二叉搜索树的主函数bool isValidBST(TreeNode* root) {// 如果节点为空,说明是合法的子树if (root == nullptr) return true;// 检查左子树是否为有效的二叉搜索树bool left = isValidBST(root->left);// 当前节点的有效性检查bool ret = false;if (root->val > prev) ret = true; // 当前节点值必须大于前一个节点值prev = root->val; // 更新前一个节点的值// 检查右子树是否为有效的二叉搜索树bool right = isValidBST(root->right);// 只有左子树、右子树都是有效BST,且当前节点符合条件时,返回truereturn left && right && ret; }
};

二叉搜索树中第K小的元素

解题思路:

  • 由于 BST 的中序遍历会按从小到大的顺序输出节点值,因此可以通过中序遍历找到第 k 小的元素。
    进行中序遍历并计数,当计数达到 k 时,当前节点即为第 k 小的节点。
    优化:如果只找到第 k 小的节点后停止遍历,可以减少不必要的遍历。

在这里插入图片描述

class Solution 
{int count; // 记录剩余的步数,找到第 k 小的元素int ret;   // 用于存储第 k 小的元素值
public:// 主函数,初始化 count 并调用深度优先搜索int kthSmallest(TreeNode* root, int k) {count = k;dfs(root);return ret;}// 中序遍历二叉搜索树的递归函数void dfs(TreeNode* root){// 如果节点为空,直接返回if (root == nullptr) return;// 递归遍历左子树dfs(root->left);// 访问当前节点,更新 countcount--;if (count == 0) ret = root->val; // 当 count 减到 0 时,找到第 k 小的元素// 递归遍历右子树dfs(root->right);}
};

二叉树的所有路径

解题思路:

  • 需要找到二叉树中所有从根节点到叶节点的路径。
    通过 DFS(深度优先搜索)来遍历每一条路径,沿途构建路径字符串:
    如果当前节点是叶节点,将当前路径字符串加入结果列表。
    如果不是叶节点,继续递归其左右子树,构建路径字符串(添加 -> 以表示路径)。
    最终返回所有路径的字符串列表。

在这里插入图片描述

class Solution 
{
public:vector<string> ret; // 用于存储所有从根到叶节点的路径vector<string> binaryTreePaths(TreeNode* root) {string path; // 当前路径字符串dfs(root, path); // 调用深度优先搜索return ret;}// 深度优先搜索函数,用于生成根到叶节点的路径void dfs(TreeNode* root, string path){// 将当前节点的值转换为字符串并加入路径path += to_string(root->val);// 如果当前节点是叶节点,将路径加入结果集if (root->left == nullptr && root->right == nullptr){ret.push_back(path);return;}// 如果不是叶节点,继续遍历,路径加上 "->"path += "->";// 遍历左子树和右子树if (root->left) dfs(root->left, path);if (root->right) dfs(root->right, path);}
};

相关文章:

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路

文章目录 计算布尔二叉树的值求根节点到叶节点的数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径 计算布尔二叉树的值 解题思路&#xff1a; 这是一个二叉树的布尔评估问题。树的每个节点包含一个值&#xff0c;其中叶子节点值为 0 或 1&#xff0…...

【计算机视觉】FusionGAN

1. FusionGAN论文阅读 abreheret/FusionGAN: Pytorch implementation of "Generating a Fusion Image: One’s Identity and Another’s Shape" 1.1. WHY 在现实世界中,将对象或人物转换为期望的形状是一种常用技术,但现有的图像翻译方法在处理身份和形状时存在…...

问:SQL优化,七条实践总结?

SQL语句优化是数据库性能调优的重要部分&#xff0c;通过合理的优化可以显著提升查询速度和系统性能。文章总结几种常见SQL语句优化方法。 1. 优化Where子句的顺序 原则&#xff1a;表之间的连接条件应写在其他Where条件之前&#xff0c;能够过滤掉最大数量记录的条件应优先写…...

unity单例模式的不同声明(待完善

总结&#xff1a; 这段代码实现了一个泛型单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;用于确保某个类&#xff08;由泛型参数 T 指定&#xff09;在整个应用程序中只有一个实例&#xff0c;并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…...

大模型在蓝鲸运维体系应用——蓝鲸运维开发智能助手

本文来自腾讯蓝鲸智云社区用户: CanWay 背景 1、运维转型背景 蓝鲸平台从诞生之初&#xff0c;就一直在不遗余力地推动运维转型&#xff0c;让运维团队可以通过一体化PaaS平台&#xff0c;快速编写脚本&#xff0c;编排流程&#xff0c;开发运维工具&#xff0c;从被动地提供…...

vue2,vue3响应式的理解

vue2的话主要使用的是defineProperty对已有属性添加get,set,从而完成对数据的响应式控制&#xff0c;但每次需要for循环对属性进行遍历 function DefineReactive(target, key, value) {//存在多层嵌套的objectObserver(value);Object.defineReactive(target, key, {get() {retu…...

群控系统服务端开发模式-应用开发-前端退出功能

我们从未登录一直到退出&#xff0c;现在已经登录到操作&#xff0c;现在完成退出。退出有两种情况下会退出&#xff1a;第一种情况下是手动点击退出按钮&#xff0c;第二种情况下是登录过期时间到了自动退出的。 一、手动退出 因退出及个人信息页面都在公有页面&#xff0c;所…...

Web入门

Spring 官网&#xff1a;Spring | Home Spring是一个开源的Java企业级应用开发框架。Spring的主要目的是使Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;开发更容易&#xff0c;并且通过提供一系列丰富的库和接口来促进良好编程实践&#xff0c;是…...

基于SpringBoot网上超市的设计与实现录像

基于SpringBoot网上超市的设计与实现录像 SpringBoot网上超市的设计与实现录像...

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…...

【mysql的当前读和快照读】

在MySQL中&#xff0c;尤其是InnoDB存储引擎中&#xff0c;读操作主要分为两种&#xff1a;当前读&#xff08;Current Read&#xff09;和快照读&#xff08;Snapshot Read&#xff09; 当前读 当前读每次读取的都是当前最新的数据。这种读操作在读取数据时不允许其他事务对这…...

[CKS] Audit Log Policy

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于audit policy的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] K8S Netw…...

【Linux】-学习笔记03

第十一章-管理Linux软件包和进程 1.源码下载安装软件 1.1概念 源码文件&#xff1a;程序编写者使用C或C等语言编写的原始代码文本文件 源码文件使用.tar.gz或.tar.bz2打包成压缩文件 1.2特点 源码包可移植性好&#xff0c;与待安装软件的工作环境依赖性不大 由于有编译过程…...

Leetcode热题100-32 最长有效括号

Leetcode热题100-32 最长有效括号 1. 题目描述2. 解题思路动态规划栈解法 3. 代码实现动态规划栈解法 1. 题目描述 32 最长有效括号 2. 解题思路 动态规划 定义状态&#xff1a; 设 dp[i] 表示以位置 i 结尾的最长有效括号子串的长度。 状态转移方程&#xff1a; 遍历字符…...

【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据

1. hbase的读数据流程 在解析读取流程之前我们还需要知道两个功能性的组件和HFIle的格式信息 HFILE 存储在hdfs中的hbase文件&#xff0c;这个文件中会存在hbase中的数据以kv类型显示&#xff0c;同时还会存在hbase的元数据信息&#xff0c;包括整个hfile文件的索引大小&…...

A027-基于Spring Boot的农事管理系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…...

Redisson的可重入锁

初始状态&#xff1a; 表示系统或资源在没有线程持有锁的情况下的状态&#xff0c;任何线程都可以尝试获取锁。 线程 1 获得锁&#xff1a; 线程 1 首次获取了锁并进入受保护的代码区域。 线程 1 再次请求锁&#xff1a; 在持有锁的情况下&#xff0c;线程 1 再次请求锁&a…...

SQL Server Service Broker完整示例

目录 准备 创建Message&#xff0c;Contract&#xff0c;Queue和Service 创建调用存储过程 启用SQL Agent并创建Job执行存储过程 调用demo 常见故障排除 准备 判断你的数据库YourDatabaseName是否启用了Service Broker SELECT is_broker_enabled FROM sys.databases WH…...

CentOS7 升级OpenSSH9.0全过程和坑

近日,漏洞肆虐,需要升级新版本,才能解决漏洞。故有此文: 0 查看当前版本 [root@host-testsvc openssh-9.0p1]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 20171、在data下新建一个独立目录openssh目录,用来存放软件 [root@host-testsvc data]# mkdir openssh…...

RSTP的配置

RSTP相对于STP在端口角色、端口状态、配置BPDU格式、配置BPDU的处理方式、快速收敛机制、拓扑变更机制和4种保护特性方面的详细改进说明&#xff1a; 端口角色&#xff1a; STP中定义了三种端口角色&#xff1a;根端口&#xff08;Root Port&#xff09;、指定端口&#xff0…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...