代码随想录算法训练营43期 | Day 14——226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、二叉树最小深度

news2025/1/11 13:59:45

代码随想录算法训练营

  • 226.翻转二叉树
  • 101. 对称二叉树
    • 递归法
  • 104.二叉树的最大深度
  • 二叉树最小深度

226.翻转二叉树

leetcode链接
在这里插入图片描述

思路:
递归三部曲:

  1. 确定递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层递归的逻辑

递归法

TreeNode* invertTreeNode(TreeNode* root)
{
	if(root==nullptr) return root;
	swap(root->left,root->right);
	invertTreeNode(root->left);
	invertTreeNode(root->right);
	return root;
}

迭代法(深度优先遍历)

 TreeNode* invertTree(TreeNode* root) {
        //迭代法 深度优先遍历
        stack<TreeNode*> st;
        //判断根节点是否为null
        if(root==nullptr) return root;
        //根节点入栈
        st.push(root);
        //循环终止条件 栈为空
        while(!st.empty())
        {
            //中
            TreeNode* node = st.top();
            //出栈
            st.pop();
            //左节点入栈
            if(node->right) st.push(node->right); //左 
            if(node->left) st.push(node->left);    //右
            swap(node->left, node->right);          //交换
        }
        return root;
    }

层序遍历(广度优先遍历)

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        //广度优先遍历
        //创建队列
        queue<TreeNode*> que;
        if(root!=nullptr) 
        //入队
        que.push(root);
        //循环终止条件 que为空
        while(!que.empty())
        {
            //size 保存队列中元素个数,需要弹出的元素个数
            int size = que.size();
            //遍历
            for(int i = 0;i<size;i++)
            {
                TreeNode* node = que.front();//取出对头元素, node指向对头元素
                //出队
                que.pop();
                //交换节点
                swap(node->left,node->right);
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);

            }
        }
        //循环结束 返回root
        return root;
    }
};

101. 对称二叉树

leetcode链接
在这里插入图片描述

递归法

递归三部曲:

  1. 确定递归函数的返回值和参数
    参数自然也是左子树节点和右子树节点,返回值为bool类型
```c++
bool compareTree(TreeNode* left, TreeNode* right){
}
```
  1. 确定递归函数的终止条件
    节点为空的情况有:
  • 左节点为空,右节点不为空,不对称,return false
  • 左不为空,右为空,不对称 return false
  • 左右都为空,对称,返回true
    此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:
  • 左节点数值!=右节点数值,返回false
    左右都不为空,比较节点数值,不相同就return false
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; // 注意这里我没有使用else
  1. 确定单层函数递归逻辑
    左右节点都不为空,且数值相同的情况
  • 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
  • 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
  • 如果左右都对称就返回true ,有一侧不对称就返回false 。
bool outside = compareTree(left->left, right->right);
bool inside = compareTree(left->right, right->left);
bool isSame = outside && inside; 
return isSame ;

完整代码

class Solution {
public:

    bool compareTree(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; // 注意这里我没有使用else

        //都不为空,数值相同的情况
        bool outside  = compareTree(left->left, right->right);
        bool inside = compareTree(left->right, right->left);
        bool isSame = outside&&inside;
        return isSame;
    }

    bool isSymmetric(TreeNode* root) {
        if(root==nullptr) return true;
        bool result = compareTree(root->left, root->right);
        return result;
    }
};

104.二叉树的最大深度

class Solution {
public:
    // 从根节点遍历,遍历左子树,遍历右子树
    //1. 确定递归函数参数和返回值
    int getLength(TreeNode* node)
    {
        if(node==nullptr) return 0;
        int leftdepth = getLength(node->left);
        int rightdepth = getLength(node->right);
        int depth = 1 + max(leftdepth, rightdepth);
        return depth;
    }
    int maxDepth(TreeNode* root) {
        int result = getLength(root);
        return result;
    }
};

二叉树最小深度

在这里插入图片描述

class Solution {
public:
    int getDepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftDepth = getDepth(node->left);           // 左
        int rightDepth = getDepth(node->right);         // 右
                                                        // 中
        // 当一个左子树为空,右不为空,这时并不是最低点
        if (node->left == NULL && node->right != NULL) { 
            return 1 + rightDepth;
        }   
        // 当一个右子树为空,左不为空,这时并不是最低点
        if (node->left != NULL && node->right == NULL) { 
            return 1 + leftDepth;
        }
        int result = 1 + min(leftDepth, rightDepth);
        return result;
    }

    int minDepth(TreeNode* root) {
        return getDepth(root);
    }
};

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

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

相关文章

谷歌「Her」来啦!发布Gemini Live语音模式,现场演示两次翻车

重磅惊喜&#xff01; 今天&#xff0c;在MadeByGoogle发布会上&#xff0c;谷歌公布了 AI语音助手 Gemini Live&#xff0c;对标的正是GPT-4o&#xff0c;而且是两周前开放测试的语音模式。 Gemini Live 可以进行顺畅的语音交流&#xff0c;听从语音指令&#xff0c;可以随时…

设计模式21-组合模式

设计模式21-组合模式&#xff08;Composite Pattern&#xff09; 写在前面 动机定义与结构定义结构主要类及其关系 C代码推导优缺点应用场景总结补充叶子节点不重载这三个方法叶子节点重载这三个方法结论 写在前面 数据结构模式 常常有一些组件在内部具有特定的数据结构。如何…

StreamUtils 流处理工具

一、工具类展示 提供对集合的过滤、拼接、排序、MAP转化、分组、转为SET集合等方法 /*** stream 流工具类**/ NoArgsConstructor(access AccessLevel.PRIVATE) public class StreamUtils {/*** 将collection过滤** param collection 需要转化的集合* param function 过滤方法…

【Linux Install】Ubuntu20, Windows10 双系统安装

1. 制作启动盘 1.1 下载 Ubuntu 系统镜像 ISO 文件 从 Ubuntu 官网下载 (https://cn.ubuntu.com/download/desktop)。官网访问慢的&#xff0c;从国内镜像点下。 1.2 烧录 Ubuntu ISO 镜像 下载 Rufus&#xff1a;从Rufus官网下载 Rufus 工具。 插入U 盘&#xff1a;将U盘插…

mysql-增添轮播图

使用工具Navicat连接mysql: 首先 然后 需要注意的是需要上面两个步骤执行之后,再点击连接测试才可以成功,其他单独连接测试都不成功,然后点击确定即可!!!!! MySQL修改: 首先,进入mysql mysql -u root -p 密码忘记参考教程:Linux错误 ERROR 1045 (28000): Acce…

数据结构入门——07堆

1.堆 堆&#xff08;Heap&#xff09;是一种特殊的完全二叉树数据结构&#xff0c;具有以下两个主要特性&#xff1a; 结构特性&#xff1a; 堆是一棵完全二叉树&#xff0c;即除了最后一层的叶子节点外&#xff0c;每一层都是满的&#xff0c;最后一层的叶子节点从左向右依次…

西安国际数字影像产业园作为一个数字创意孵化园的实际情况怎么样?

在科技飞速发展的今天&#xff0c;数字创意产业正迅速崛起&#xff0c;成为全球经济的新增长点。西安国际数字影像产业园作为中国西部数字创意产业的领军者&#xff0c;凭借其独特的优势和发展策略&#xff0c;迅速崭露头角&#xff0c;成为全国瞩目的焦点。那么&#xff0c;是…

前端统计SDK设计和实现

前端统计的范围 访问量 PV自定义事件性能&#xff0c;错误 前端统计的实现 发送统计数据 不用 axios ( 因为统计服务器通常由第三方提供&#xff0c;需要跨域 )&#xff0c;而用 img 发送&#xff0c;因为可跨域&#xff0c;且兼容性非常好 自定义事件的统计 pv 的统计 性能…

【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面之Tabs(三)

学完时间&#xff1a;2024年8月14日 一、前言叨叨 学习HarmonyOS的第六课&#xff0c;人数又成功的降了500名左右&#xff0c;到了3575人了。 本文接上一文章【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面&#xff08;一&#xff09;&#xff0c;继续记录构建更…

探索数据结构:AVL树的分析与实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. AVL树的介绍 在前面我们学习二叉搜索树时知道&#xff0c;在数据有序…

鸿蒙开发APP应用UX体验标准

基础体验 应用导航 3.1.1.1 系统返回 页面布局 3.1.2.1 布局基础要求 3.1.2.2 挖孔区适配 人机交互 3.1.3.1 避免与系统手势冲突3.1.3.2 典型手势时长设计3.1.3.3 点击热区 视觉风格 3.1.4.1 色彩对比度3.1.4.2 字体大小 3.1.4.3 图标 3.1.4.3.1 应用图标3.1.4.3.2 界…

统一响应结果封装,Result类的实现【后端 06】

统一响应结果封装&#xff0c;Result类的实现 在开发Web应用或API接口时&#xff0c;如何优雅地处理并返回响应结果是每个开发者都需要考虑的问题。统一响应结果封装&#xff08;Unified Response Encapsulation&#xff09;作为一种广泛采用的实践&#xff0c;不仅提高了API的…

快讯 | OpenAI 找回场子:chatgpt-4o-latest 刷新多项AI跑分纪录

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

LeetCode 205 同构字符串

题目 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符的顺序。不同字符不能映射到同一个字符上&#xff0c…

边缘智能:让每一个温室都成为计算中心

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;当人工智能的浪潮席卷全球&#xff0c;大语言模型&#xff08;LLM&#xff09;引领智能风潮之时&#xff0c;"智慧农业"也摩拳擦掌跃跃欲试。设施农业作为现代农业的翘楚&#xff0c;正站在数智化变革…

C语言典型例题38

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题3.5 写程序&#xff0c;判断某一年是否为闰年 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题3.5 写程序&#xff0c;判断某一年是否为闰年//相关知识&#xff1a;如果…

观存储历史,论数据未来

数据存储 这几天我反复观看了腾讯云社区的《中国数据库前世今生》纪录片&#xff0c;每次的感受都大相径庭。以下是我在这段时间里对纪录片的两个不同感想&#xff0c;希望感兴趣的小伙伴们也能去观看一番。 一个是关于国产数据库的发展趋势的探讨&#xff1a;https://blog.c…

使用 C# 反射查询程序集的元数据 (LINQ)

文章目录 1. 反射概述2. LINQ 概述3. 使用反射和 LINQ 查询程序集的元数据4. 扩展&#xff1a;查询字段和属性5. 扩展示例&#xff1a;查询公共类及其属性和方法6. 总结 在 C# 中&#xff0c;反射是一个强大的工具&#xff0c;它允许我们在运行时检查程序集、类型、方法等的元数…

机器学习速成第二集——监督学习之回归(理论部分)!

目录 回归算法 线性回归与非线性回归在实际应用中的优缺点比较是什么&#xff1f; 线性回归的优缺点 非线性回归的优缺点 优点&#xff1a; 缺点&#xff1a; 多项式回归模型如何选择最佳的多项数以提高预测准确性&#xff1f; 岭回归和套索回归在防止过拟合方面的具体…

【屏驱MCU】实现文件路径的的挂载

说明&#xff1a;本文涉及到一些底层的 .py 编译脚本以及编辑原理&#xff0c;笔者也不是完全明白&#xff0c;本文的主要目的是介绍一下流程&#xff0c;供小白使用。 接上文&#xff1a;【屏驱MCU】RT-Thread 文件系统接口解析 屏驱MCU系列文章 【屏显MCU】多媒体接口总结&am…