【二叉搜素树】——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);}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14651.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2023年MathorCup数学建模A题量子计算机在信用评分卡组合优化中的应用解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 A题 量子计算机在信用评分卡组合优化中的应用 原题再现&#xff1a; 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需要先通过各种审核规则对客户的信用等级进行评定&#xff0c;通过评定后的客户才能…

嵌入式开发套件(golang版本)

1. watchdog&#xff08;软件看门狗&#xff1a;守护升级&#xff09; 2. gate&#xff08;主程序&#xff09; 3. web&#xff08;api版本 升级包&#xff09; OTA 升级流程 watchdog启动后检查守护进程gate是否正在运行&#xff0c;如果没有&#xff0c;api对比版本号&am…

解压专家 2.4.12| 多功能解压缩工具,支持密码共享、音乐播放和歌词匹配。

解压专家是一款功能强大的解压缩软件&#xff0c;提供了类似于WIFI万能钥匙的密码分享功能&#xff0c;帮助用户快速获取共享的解压密码。作为专业的解压缩工具&#xff0c;它支持多种常见和不常见的压缩包格式&#xff0c;如ZIP、RAR、7z、TAR.GZ和ISO等&#xff0c;并且还支持…

并发编程(10)——内存模型和原子操作

文章目录 十、day101. 内存模型基础1.1 对象和内存区域1.2 改动序列 2. 原子操作及其类型2.1 原子操作2.2 原子类型2.3 内存次序2.4 std::atomic_flag2.4.1 自旋锁 2.5 std::atomic&#xff1c;bool&#xff1e;2.6 std::atomic<T*>2.7 标准整数原子类型2.8 std::atomic&…

【Flink】-- flink新版本发布:v2.0-preview1

目录 1、简介 2、非兼容变更 2.1、API 2.2、连接器适配计划 2.3、配置 2.4、其它 3、重要新特性 3.1、存算分离状态管理 3.2、物化表 3.3、批作业的自适应执行 3.4、流式湖仓 4、附加 4.1、非兼容性的 api 程序变更 4.1.2、Removed Classes # 4.1.3、Modified Cl…

ffmpeg+D3D实现的MFC音视频播放器,支持录像、截图、音视频播放、码流信息显示等功能

一、简介 本播放器是在vs2019下开发&#xff0c;通过ffmpeg实现拉流解码功能&#xff0c;通过D3D实现视频的渲染功能。截图功能采用libjpeg实现&#xff0c;可以截取jpg图片&#xff0c;图片的默认保存路径是在C:\MYRecPath中。录像功能采用封装好的类Mp4Record实现&#xff0c…

webpack指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;webpack篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack-指南 概念 中文&#xff1a; webpack | webpack中文文档 | webpack中文网 英文&…

把越南语翻译成中文一般用什么翻译工具?《越南语翻译通》App或许能满足你的技术痛点需求!

在多语言交流日益频繁的今天&#xff0c;掌握越南语对于商务、旅游或学术交流都是一项重要技能。《越南语翻译通》App应运而生&#xff0c;旨在通过技术手段简化越南语学习和翻译过程&#xff0c;满足用户在不同场景下的需求。 核心技术 《越南语翻译通》App采用了先进的自然语…

Android Framework AMS(16)进程管理

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…

Rust Struct 属性初始化

结构体是用户定义的数据类型&#xff0c;其中包含定义特定实例的字段。结构有助于实现更容易理解的抽象概念。本文介绍几种初始化结构体对象的方法&#xff0c;包括常规方法、Default特征、第三方包实现以及构建器模式。 Struct声明与初始化 struct Employee {id: i32,name: …

Vue全栈开发旅游网项目(10)-用户管理后端接口开发

1.异步用户登录\登出接口开发 1.设计公共响应数据类型 文件地址&#xff1a;utils/response404.py from django.http import JsonResponseclass BadRequestJsonResponse(JsonResponse):status_code 400def __init__(self, err_list, *args, **kwargs):data {"error_c…

数据结构:队列

目录 概念与结构底层结构的选择队列的实现队列头文件&#xff08;queue.h&#xff09;队列初始化队列的销毁入队列检查队列是否为空出队列查询队列第一个数据查询队列末尾数据查询队列有效数据个数代码试运行 概念与结构 概念&#xff1a;只允许在⼀端进行插⼊数据操作&#x…

Clickhouse集群新建用户、授权以及remote权限问题

新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;再其他节点下用户建本地表成功&#…

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音…

i春秋-SQLi(无逗号sql注入,-- -注释)

练习平台地址 竞赛中心 题目描述 后台有获取flag的线索应该是让我们检查源码找到后台 题目内容 空白一片 F12检查源码 发现login.php 访问login.php?id1 F12没有提示尝试sql注入 常规sql注入 //联合注入得到表格列数 1 order by 3 # 1 union select 1,2,3 #&#xff08…

基于Spring Boot的电子商务平台架构

2 相关技术 2.1 SpringBoot框架介绍 Spring Boot是一种不需要代码生成的一种框架&#xff0c;并且可以不需要配置任何的XML文件就可以&#xff0c;因为Spring Boot里面自带了很多接口&#xff0c;只需要配置不同的接口就会自动的应用并且识别需要的依赖&#xff0c;在配置方面非…

华为云分布式缓存服务(DCS)专家深度解析Valkey,助力openEuler峰会

在数字化时代&#xff0c;开源技术已成为推动创新和协作的重要力量。 11月15日&#xff0c;openEuler峰会将于北京中关村国际创新中心举行。本次峰会&#xff0c;华为云分布式缓存服务&#xff08;DCS&#xff09;的两位专家将为大家深入讲解Valkey的核心特性与优势。 更多大…

如何进行产线高阶能耗数据的计算和可视化?

一、前言 在当前经济下行时期&#xff0c;越来越来多企业开始对产线进行数字化转型&#xff0c;提高企业竞争力。在产线数字化转型过程中&#xff0c;产线高阶能耗数据的计算和可视化是比较重要的一环&#xff0c;今天小编就和大家分享如何对产线能耗数据进行计算和可视化。 …

vsftp 修改端口 限制用户登录 开启防火墙 pasv模式

安装设置开机启动 yum -y install vsftpd systemctl start vsftpd systemctl enable vsftpd 修改配置&#xff0c;追加端口号到最后一行 vim /etc/vsftpd/vsftpd.conf listen_port5510 编辑 /etc/services 文件&#xff0c;将其中的三行端口改成5510 vim /etc/services ftp …

IntelliJ IDEA插件开发-代码补全插件入门开发

使用IntelliJ IDEA想必大家都有使用过代码自动补全功能&#xff0c;如输入ab&#xff0c;会自动触发补全&#xff0c;提供相应的补全建议列表。作为有追求的程序员&#xff0c;有没有想过这样的功能是如何实现的&#xff1f;本节将详细介绍如何实现一个类似的代码自动补全插件。…