二叉树练习题(2024/6/5)

1翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

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

示例 3:

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

提示:

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

递归思路:

  1. 首先,检查根节点是否为空,如果为空则直接返回空节点。
  2. 对于每个非空节点,交换其左右子树(即将左子树和右子树进行交换)。
  3. 递归地对左子树调用 invertTree 函数,实现左子树的翻转。
  4. 递归地对右子树调用 invertTree 函数,实现右子树的翻转。
  5. 最后返回根节点,完成整棵二叉树的翻转操作。

递归代码:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        swap(root->left, root->right);  // 交换左右子树
        invertTree(root->left);         // 递归处理左子树
        invertTree(root->right);        // 递归处理右子树
        return root;
    }
};

迭代思路:

首先检查根节点是否为空,如果为空则返回0。随后创建一个栈,将根节点压入栈中。在循环中,不断取出栈顶元素,交换其左右子树,并将存在的左子树和右子树压入栈中。当栈为空时,所有节点都已经遍历并翻转,返回根节点完成翻转操作

迭代代码:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return 0; // 若根节点为空,则返回0
        stack<TreeNode*> st; // 创建一个栈用于存储待处理节点
        st.push(root); // 将根节点入栈
        while (!st.empty()) { // 当栈不为空时
            TreeNode* node = st.top(); // 获取栈顶元素
            st.pop(); // 弹出栈顶元素
            swap(node->left, node->right); // 交换当前节点的左右子树
            if (node->left) st.push(node->left); // 如果左子树不为空,则将其入栈
            if (node->right) st.push(node->right); // 如果右子树不为空,则将其入栈
        }
        return root; // 返回翻转后的树的根节点
    }
};

2对称二叉树

给你一个二叉树的根节点 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

思路:

判断一个二叉树是否对称时,有以下几种情况需要考虑:

  1. 根节点为空:如果根节点为空,则二叉树被视为对称的,因为空树被认为是对称的。

  2. 左右节点为空情况:当左节点为空而右节点不为空,或者左节点不为空而右节点为空时,这种情况下两个节点不对称。

  3. 节点值不相等:如果左右节点的值不相等,那么这两个节点不对称。

  4. 子树不对称:如果左节点的左子树与右节点的右子树不对称,或者左节点的右子树与右节点的左子树不对称,那么这两个节点也不对称。

代码:

class Solution {
public:
    // 递归函数,用于比较左右子树是否对称
    bool compare(TreeNode* left, TreeNode* right) {
        // 首先排除空节点的情况
        if (left == NULL && right != NULL) return false;
        else if (left != NULL && right == NULL) return false;
        else if (left == NULL && right == NULL) return true;
        // 排除了空节点,再排除数值不相同的情况
        else if (left->val != right->val) return false;

        // 此时左右节点都不为空,且数值相同的情况,继续递归判断子树
        bool outside = compare(left->left, right->right);   // 左子树的左节点和右子树的右节点比较
        bool inside = compare(left->right, right->left);    // 左子树的右节点和右子树的左节点比较
        bool isSame = outside && inside;                    // 判断是否对称
        return isSame;                                      // 返回结果
    }

    // 主函数,判断整棵树是否对称
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;      // 空树也算对称
        return compare(root->left, root->right);  // 调用递归函数比较左右子树
    }
}

3二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

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

递归思路:

  1. etdepth 函数:用于计算树的深度。若根节点为空,则深度为0;否则分别递归计算左子树和右子树的深度,并取其中较大的深度加1作为当前节点的深度。

  2. maxDepth 函数:是主函数,直接调用 getdepth 函数计算二叉树的最大深度,并返回结果。

递归代码:

class Solution {
public:
    // 递归函数,用于计算树的深度
    int getdepth(TreeNode* root) {
        if (root == NULL) return 0; // 如果根节点为空,深度为0
        int leftdepth = getdepth(root->left);       // 递归获取左子树的深度
        int rightdepth = getdepth(root->right);     // 递归获取右子树的深度
        int depth = 1 + max(leftdepth, rightdepth); // 当前节点的深度为左右子树深度的最大值加1
        return depth; // 返回当前节点的深度
    }

    // 主函数,获取二叉树的最大深度
    int maxDepth(TreeNode* root) {
        return getdepth(root); // 调用计算深度的递归函数
    }
};

迭代思路:

  1. 首先判断根节点是否为空,若为空则直接返回深度为0。

  2. 创建一个队列 que 存储节点,并将根节点放入队列。

  3. 进入循环,每次循环代表遍历一层节点,增加深度。

  4. 遍历当前层的节点,取出队首节点,如果存在左子节点,则将左子节点入队;如果存在右子节点,则将右子节点入队。

  5. 继续循环直到队列为空,返回最大深度。

迭代代码:

class Solution {
public:
    // 计算二叉树的最大深度
    int maxDepth(TreeNode* root) {
        if (root == nullptr) return 0; // 如果根节点为空,深度为0
        int maxDepth = 0; // 初始化最大深度为0
        queue<TreeNode*> que; // 创建一个队列存储节点
        que.push(root); // 根节点入队

        while (!que.empty()) { // 当队列不为空时循环
            int size = que.size(); // 获取当前队列的大小,即当前层节点数
            maxDepth++; // 对应深度加1

            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front(); // 取出队首节点
                que.pop(); // 队首节点出队

                if (node->left) que.push(node->left); // 如果左子节点存在,将左子节点入队
                if (node->right) que.push(node->right); // 如果右子节点存在,将右子节点入队
            }
        }

        return maxDepth; // 返回二叉树的最大深度
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

空间不够用了怎么办

空间告急啊哥们 整理一下清理空间有用的一些blog吧。 【linux】公共服务器如何清理过多的.cache缓存 linux根目录空间不足&#xff0c;追加空间到根目录下 【linux】linux磁盘空间 目录查看清理 和 文件查看清理

windows系统 flutter 开发环境配置

1、管理员运行powershell&#xff0c;安装&#xff1a;Chocolatey 工具&#xff0c;粘贴复制运行下列脚本: Chocolatey 官方安装文档 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManage…

韩顺平0基础学Java——第17天

p342-373 上课的时候一部分在纸上写过了&#xff0c;就不在这里复盘了。 this可以调用本类的所有方法&#xff0c;super可以调用父类的非private方法 Test Demo Rose Jack John jack 重写equals方法&#xff1a; 15&#xff1a; 1.调用C的有参构造器 2.进入B的有参构造器…

数字化营销有哪些模式?企业采用数字营销方式有什么意义?

在当今快速发展的商业环境中&#xff0c;营销已经远远超越了传统的推广和销售概念&#xff0c;演变成一种复杂而全面的组织职能。随着信息技术的飞速发展&#xff0c;数字化营销应运而生&#xff0c;为企业与消费者之间的互动带来了革命性的改变。数字化营销不仅为企业提供了全…

Spark SQL - 操作数据帧

本教程将通过一个具体的案例来演示如何在Spark SQL中操作数据帧。我们将从获取学生数据帧开始&#xff0c;包括两种方法&#xff1a;一是由数据集转换而来&#xff0c;二是直接读取文件生成数据帧。然后&#xff0c;我们将对数据帧进行各种操作&#xff0c;如投影、过滤、统计和…

SpringCache 缓存 - @Cacheable、@CacheEvict、@CachePut、@Caching、CacheConfig 以及优劣分析

目录 SpringCache 缓存 环境配置 1&#xff09;依赖如下 2&#xff09;配置文件 3&#xff09;设置缓存的 value 序列化为 JSON 格式 4&#xff09;EnableCaching 实战开发 Cacheable CacheEvict CachePut Caching CacheConfig SpringCache 的优势和劣势 读操作…

【网络协议 | HTTP】HTTP总结与全梳理(一) —— HTTP协议超详细教程

&#x1f525;博客简介&#xff1a;开了几个专栏&#xff0c;针对 Linux 和 rtos 系统&#xff0c;嵌入式开发和音视频开发&#xff0c;结合多年工作经验&#xff0c;跟大家分享交流嵌入式软硬件技术、音视频技术的干货。   ✍️系列专栏&#xff1a;C/C、Linux、rtos、嵌入式…

nginx代理vue项目路由跳转刷新

常规代理 在我们日常开发中&#xff0c;前端部署到服务器&#xff0c;需要用到nginx部署&#xff0c;简单代理如下&#xff1a; #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid…

GPT革命:AI如何重塑我们的未来!

GPT革命&#xff1a;AI如何重塑我们的未来&#xff01; &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享…

并查集算法

目录 1.算法介绍 1.1什么是并查集呢&#xff0c;它又是用来干什么的呢&#xff1f; 1.2问题引入 2.算法解析 2.1初始化 2.2合并操作 2.3查找 路径压缩 2.4问题解决代码 3.变式突破 1.算法介绍 1.1什么是并查集呢&#xff0c;它又是用来干什么的呢&#xff1f; 逐字拆…

经典的泡泡龙游戏源码免费下载

源码介绍 HTML5泡泡龙冒险小游戏是一款休闲网页游戏&#xff0c;游戏玩法是玩家从下方中央的弹珠发射台射出彩珠&#xff0c;多于3个同色珠相连则会消失。 源码下载 经典的泡泡龙游戏源码免费下载

【Python绘画】画正方形简笔画

本文收录于 《一起学Python趣味编程》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、代码示例三、知识点梳理四、总结 一、前言 本文介绍如何使用Python的海龟画图工具turtle&#…

docker-compose入门级实战教程

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

Flutter Bloc之简单记录

目录 0.库安装 1.插件和自动生成 2.状态的配置 1.初始化中&#xff1a; 2.赋值完成后&#xff1a; 3.如果出错&#xff1a; 3.事件的配置 1.定义一个读取事件 2.定义一个更改事件 4.Bloc的设置 5.Bloc的使用 1.BlocProvider 2.内部调用 参考文章进行类的配置 0.库…

【ARM Cache 系列文章 2.1 -- Cache PoP 及 PoDP 介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 PoP 及 PoDPCache PoDPCache PoP应用和影响PoP 及 PoDP Cache PoDP 点对深度持久性(Point of Deep Persistence, PoDP)是内存系统中的一个点,在该点达到的任何写操作即使在系统供电…

跳跃游戏二

方法一&#xff1a;&#xff08;双指针法&#xff09;此题参考跳台阶问题&#xff0c;题目要求求到达最后一个点的最小跳跃次数&#xff0c;那么我们就可以从最后一个往前推&#xff0c;先看谁能离得最远&#xff0c;并且能跳到最后一个。假设i位置是离最后一个位置最远&#x…

网工内推 | 联通公司,云计算售前,AWS认证优先

01 联通数字科技有限公司 &#x1f537;招聘岗位&#xff1a;云计算售前工程师 &#x1f537;职责描述&#xff1a; 1.了解私有云&#xff0c;公有云&#xff0c;混合云等云计算技术知识&#xff0c;了解云计算行业现状及发展趋势。 2.承担区域项目售前工作支持&#xff0c;为…

Linux基础指令磁盘管理002

LVM&#xff08;Logical Volume Manager&#xff09;是Linux系统中一种灵活的磁盘管理和存储解决方案&#xff0c;它允许用户在物理卷&#xff08;Physical Volumes, PV&#xff09;上创建卷组&#xff08;Volume Groups, VG&#xff09;&#xff0c;然后在卷组上创建逻辑卷&am…

NSS题目练习7

[MoeCTF 2022]baby_file 打开看见一串源代码&#xff0c;需要get传参传入file 题目提示php伪协议 用dirsearch扫描发现flag.php 用php伪协议查看&#xff0c;回显一串base64编码 解码后得到flag [鹤城杯 2021]Middle magic 读取这两个文件 一个php正则表达式 补充&#xff1a…

Element ui图片上传

前言 对于广大小白来说&#xff0c;图片上传简直是上传难&#xff0c;难于上青天&#xff01;废话不多说&#xff0c;步入正题&#xff0c;您就瞧好吧&#xff01; 步骤一&#xff1a;前端使用element ui组件&#xff08;upload上传&#xff09; 我个人喜欢使用第二个组件&a…