力扣hot100--二叉树

news2024/10/17 17:21:45

目录

二叉树

1. 94. 二叉树的中序遍历

2. 98. 验证二叉搜索树

3. 101. 对称二叉树

 


二叉树

1. 94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

// 二叉树的遍历
class Solution {
public:
    vector<int> result; // 用来存储中序遍历的结果的向量

    // 中序遍历的递归函数
    void inorder(TreeNode* root){
        if(!root) return; // 如果节点为空,直接返回

        inorder(root->left); // 递归遍历左子树
        result.push_back(root->val); // 将当前节点的值加入结果向量
        inorder(root->right); // 递归遍历右子树
    }

    // 主函数,返回中序遍历的结果
    vector<int> inorderTraversal(TreeNode* root) {
        inorder(root); // 调用中序遍历的递归函数
        return result; // 返回结果向量
    }
};

解释: 

  • 从根节点开始,先访问左子树,然后访问根节点,最后访问右子树。
  • 对于当前的二叉树:
    • 根节点为 1,先访问左子树,但是左子树为空,因此直接访问根节点 1,将 1 加入结果数组。
    • 然后访问右子树,右子树是节点 2
    • 对于节点 2,先访问左子树,即节点 3。访问节点 3,将 3 加入结果数组。
    • 然后访问根节点 2,将 2 加入结果数组。

2. 98. 验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    // 定义一个辅助函数,用于检查每个节点及其子树是否满足二叉搜索树的定义
    bool isBSTHelper(TreeNode* root, int minVal, int maxVal) {
        // 如果节点为空,返回true
        if (!root) return true;
        
        // 检查当前节点值是否在允许的范围内
        if (root->val <= minVal || root->val >= maxVal) {
            return false;
        }
        
        // 递归检查左子树和右子树,更新范围
        return isBSTHelper(root->left, minVal, root->val) &&
               isBSTHelper(root->right, root->val, maxVal);
    }

    // 主函数,判断给定的二叉树是否是有效的二叉搜索树
    bool isValidBST(TreeNode* root) {
        // 初始时,最小值为INT_MIN,最大值为INT_MAX
        return isBSTHelper(root, INT_MIN, INT_MAX);
    }
};

3. 101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x, left(left), right(right)) {}
 * };
 */
class Solution {
public:
    // 递归函数,检查两个子树是否是镜像对称的
    bool recursive(TreeNode* left, TreeNode* right) {
        // 如果两个子树都为空,则它们对称,返回true
        if (!left && !right) return true;
        
        // 如果一个子树为空,而另一个子树不为空,则不对称,返回false
        else if (left && !right) return false;
        else if (!left && right) return false;

        // 如果两个子树的根节点值不相等,则不对称,返回false
        if (left->val != right->val) return false;
        
        // 递归检查左子树的左子节点与右子树的右子节点是否对称,以及
        // 左子树的右子节点与右子树的左子节点是否对称
        bool flag = recursive(left->left, right->right);
        bool flag1 = recursive(left->right, right->left);

        // 只有当左右两侧子树都对称时,返回true;否则返回false
        return flag && flag1;
    }

    // 检查整个树是否是对称的
    bool isSymmetric(TreeNode* root) {
        // 如果根节点为空,树是对称的,返回true
        if (!root) return true;

        // 调用递归函数,检查根节点的左子树和右子树是否是镜像对称的
        return recursive(root->left, root->right);
    }
};

 

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

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

相关文章

[ComfyUI]最好用的图像提示词反推工具发布 2.0 版本啦!更好用了!

图像提示词反推工具我也介绍了好一些了&#xff0c;但是架不住技术一直在迭代啊&#xff01;过一段时间就出一个新的&#xff0c;或者是升级版&#xff0c;所以我们的分享也不能停&#xff01; 前段时间 joy_caption 蛮火的&#xff0c;不过后来也陆陆续续出了一些比较好用的反…

JMeter性能测试时,如何做CSV参数化

在现代软件开发中&#xff0c;性能测试是保证应用程序在高负载条件下稳定运行的重要环节。为了实现真实场景的测试&#xff0c;参数化技术应运而生。其中&#xff0c;CSV参数化是一种高效且灵活的方法&#xff0c;可以让测试人员通过外部数据文件驱动测试脚本&#xff0c;从而模…

U-Boot阶段系统全量更新固件包制作杂记

背景&#xff1a;有一个在 U-Boot 阶段做系统全量自更新的需求&#xff0c;要制作系统的全量固件包&#xff08;U-Boot.img、kerlen.img、rootfs.img&#xff09;。大体分为三个主要部分&#xff1a;U-Boot-shell 脚本编写、打包各镜像为一个固件包、固件包的加密和解密 一、U…

电采暖集控系统陕西高陵体育馆应用项目案例

电采暖集控系统是一种集监测、控制和管理于一体的智能管理系统&#xff0c;旨在提高采暖效率、降低能耗和运营成本&#xff0c;同时提升用户的舒适度。该系统利用先进的计算机控制技术和系统集成技术&#xff0c;实现对电热采暖设备的集中管理和远程操控。 陕西高陵体育馆 是…

四川方维嘉术科技有限公司简介

四川方维嘉术科技有限公司 公司简介 四川方维嘉术科技有限公司成立于2023年&#xff0c;注册资本100万元整&#xff0c;位于中国西南地区的中心位置&#xff0c;是一家专注于供应医疗设备、高值耗材并提供医疗方面解决方案的企业。 【主要代理产品】 湖南瑞康通 &#xff1…

Alberta Wells数据集:首个包含超过213,000个油气井的大规模高质量基准数据集,它们是温室气体和其他污染物的重要来源,助力环境监测与气候变化。

2024-10-11&#xff0c;由Mila – Quebec AI Institute和McGill University等机构创建了首个大规模油井检测数据集&#xff0c;这个数据集的意义在于提供了一个工具&#xff0c;能够通过卫星图像识别和定位全球数以百万计的废弃油气井&#xff0c;这对于减少温室气体排放和保护…

数据结构与算法:堆与优先队列的深入剖析

数据结构与算法&#xff1a;堆与优先队列的深入剖析 堆是一种特殊的树形数据结构&#xff0c;广泛应用于优先队列的实现以及各种高效的算法中&#xff0c;如排序和图算法。通过深入了解堆的结构、不同堆的实现方式&#xff0c;以及堆在实际系统中的应用&#xff0c;我们可以掌…

使用js和canvas实现简单的网页打砖块小游戏

玩法介绍 点击开始游戏后&#xff0c;使用键盘上的←→控制移动&#xff0c;小球会不停移动&#xff0c;板子触碰小球时会反弹&#xff0c;碰撞到砖块时会摧毁砖块&#xff0c;如果没有用板子接住小球就游戏失败 代码实现 代码比较简单&#xff0c;直接阅读注释即可&#x…

工作日志:elementplus上传图片问题

问题&#xff1a;打开弹窗&#xff0c;上传一张照片后&#xff0c;关闭再打开&#xff0c;之前上传的图片仍在列表里展示。 然后添加了几行代码&#xff0c;报错。 <el-upload list-type"picture-card":limit"1":on-success"handleAvatarSuccess&…

Spring Boot 之三大配置文件.properties、.yml、.yaml 及其优先级解析

Spring Boot 的强大之处在于其高度可配置性&#xff0c;允许开发者根据不同环境和需求定制应用程序的行为。而这一切的核心便是配置文件。Spring Boot 支持多种配置文件格式&#xff0c;其中最常用的三种是 .properties、.yml 和 .yaml。 1. .properties&#xff1a;传统方式 …

基于NXP LS1023+FPGA的嵌入式解决方案

基于 NXP公司的LS1043A高性能64位ARM四核处理器。 LS1043A处理器是NXP公司面向嵌入式网络推出的一款四核64位ARM处理器&#xff0c; 支持无风扇设计的灵活I/O封装&#xff0c; 提供超过10 Gbps的性能&#xff0c;是专为小规格网络和工业应用而设计的解决方案。全新23x23封装方式…

jquery实现点击菜单实现高德地图定位点与数据展示联动效果

&#x1f34a;jquery实现点击菜单实现高德地图定位点与数据展示联动效果 版本介绍&#xff1a; jQuery v3.7.1高德地图JS API 2.0 代码仓库 ⭐ Gitee&#xff1a;实现点击菜单实现高德地图定位点与数据展示联动效果 1.启动说明 &#x1f4d4; 推荐VS Code编辑器插件Live Ser…

java项目之信息化在线教学平台的设计与实现(源码+文档)

项目简介 信息化在线教学平台的设计与实现实现了以下功能&#xff1a; 信息化在线教学平台的设计与实现的主要使用者管理员功能有个人中心&#xff0c;学生信息管理&#xff0c;教师信息管理&#xff0c;教学信息管理&#xff0c;学生成绩管理&#xff0c;留言板管理&#xf…

29.数据结构与算法-查找-查找的基本概念

查找的基本概念 查找表 主关键字与次关键字 查找是否成功 查找的目的&#xff08;查询&#xff0c;检索&#xff0c;插入&#xff0c;删除&#xff09; 查找表的分类&#xff08;静态查找表&#xff0c;动态查找表&#xff09; 如何评价查找算法&#xff08;平均查找长度ASL&a…

前端编程艺术(5)---Vue3(从零基础到项目开发)

目录 1.Vue.js 2.快速上手 2.数据响应式 1.reactive函数 2.ref函数 3.Vue工程化 1.安装node.js 2.脚手架创建项目 3.项目setup 4.vue指令 1.内容渲染指令 2.属性绑定指令 3.事件绑定指令 4.条件渲染指令 5.列表渲染指令 6.双向绑定指令 7.指令修饰符 8.样式绑…

[JAVAEE] 创建线程的方法 + Thread类中的常用方法 + 线程状态

目录 一. 创建线程的方法 1.1 继承 Thread 类. 1.2 实现 Runnable 接口. 1.3 lambda表达式创建线程 二. Thread类中的常用方法 2.1 start方法 2.2 run方法 2.3 sleep静态方法 2.4 isDaemoon() and setDaemon() 2.5 isAlive() 2.6 Thread.currentThread() 2.7 inter…

anzocapital:交易量对止损和止盈策略的影响

在金融市场中&#xff0c;交易量的波动对交易策略有着深远的影响。anzocapital作为一家专业的金融服务提供商&#xff0c;深知交易量对止损和止盈策略的重要性。大额交易订单往往优先执行&#xff0c;这可能导致EA设置的小止损和小止盈在实际操作中出现偏差。 以市场开盘为例&…

什么是大模型?(超详细)大模型从入门到精通,看这一篇就够了!

大模型的定义 大模型是指具有数千万甚至数亿参数的深度学习模型。近年来&#xff0c;随着计算机技术和大数据的快速发展&#xff0c;深度学习在各个领域取得了显著的成果&#xff0c;如自然语言处理&#xff0c;图片生成&#xff0c;工业数字化等。为了提高模型的性能&#xf…

【Kubernetes① 基础】一、容器基础

目录 一、进程二、隔离与限制三、容器镜像 一、进程 容器技术的兴起源于PaaS技术(平台即服务)的普及&#xff1b;Docker公司发布的Docker项目具有里程碑式的意义&#xff1b;Docker项目通过“容器镜像”解决了应用打包这个根本性难题(CloudFoundry)。 容器本身的价值非常有限&a…

大模型还能让我们望梅止渴多久?

大模型梦碎的时间点似乎越来越近。过去一周&#xff0c;有关人工智能的消息糟糕多于积极。 周初&#xff0c;诺贝尔物理学奖和化学奖接连砸向时下正热的人工智能领域。这些奖项出人意料且鼓舞人心&#xff0c;意味着人工智能的确已经根本性地改变了我们生活和科学体系的方方面…