LeetCode 热题 100之二叉树

1.二叉树的中序遍历

在这里插入图片描述
思路分析1(递归):通过一个辅助函数 inorderHelper,递归地访问左子树、根节点和右子树,实现中序遍历。

具体实现代码(详解版):

class Solution {
public:
    void inorderHelper(TreeNode* root, vector<int>& result) {
        if (root == nullptr) return;  // 基本情况:空节点
        inorderHelper(root->left, result);  // 递归访问左子树
        result.push_back(root->val);        // 访问根节点
        inorderHelper(root->right, result); // 递归访问右子树
    }
    
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        inorderHelper(root, result);  // 调用辅助函数
        return result;
    }
};

思路分析2(迭代法,使用栈模拟)

  • 初始化
    • 创建一个栈stack用于存储节点
    • 设置一个指针current指向根节点root
  • 遍历左子树
    • 进入循环,在current非空的情况下
      • 将当前节点current入栈
      • 移动current到当前节点的左子节点,继续尝试访问左子树
    • 当到达最左端时,current会为nullptr,这时完成左子树的遍历
  • 访问跟根节点
    • 从栈中弹出一个节点,将其值添加到结果数组result中;
    • 弹出的节点就是当前子树的根节点,按照中序遍历的顺序,我们在遍历完左子树后应该访问根节点。
  • 遍历右子树
    • 将 current 移动到右子节点,并开始新一轮的循环以遍历右子树(如果右子树存在,会重复步骤 2 和 3
    • 如果右子树为空,则会弹出下一个节点并继续处理,直到栈为空且 current 为 nullptr 时结束遍历。

具体实现代码(详解版):

/**
 * 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:
    vector<int> inorderTraversal(TreeNode* root) {
       vector<int> result;
       stack<TreeNode*> stack;
       TreeNode* current = root;

       while(current != nullptr || !stack.empty()){
         //将左字节点入栈直到最左端
         while(current != nullptr){
            stack.push(current);
            current = current->left;
         }
         //处理栈顶节点(左根右中的根)
         current = stack.top();
         stack.pop();
         result.push_back(current->val);//访问根节点

         //转到右子树
         current = current->right;
       }
       return result;
    }
};

2.二叉数的最大深度

在这里插入图片描述
思路分析1(递归,DFS):递归方法利用树的定义,每个节点的深度是其左子树和右子树深度的最大值加 1。根节点的深度就是整个树的深度。

具体实现代码(详解版):

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == nullptr) return 0;  // 空节点深度为 0
        int leftDepth = maxDepth(root->left);   // 递归计算左子树深度
        int rightDepth = maxDepth(root->right); // 递归计算右子树深度
        return max(leftDepth, rightDepth) + 1;  // 取左右子树的最大深度并加 1
    }
};

思路分析2(迭代,BFS):可以使用队列进行广度优先搜索(BFS)。每次遍历到下一层时,深度增加 1。最终的深度就是树的最大深度。
具体实现代码(详解版):

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == nullptr) return 0;
        
        queue<TreeNode*> q;
        q.push(root);
        int depth = 0;

        while (!q.empty()) {
            int levelSize = q.size();
            depth++;
            
            for (int i = 0; i < levelSize; i++) {
                TreeNode* node = q.front();
                q.pop();
                
                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);
            }
        }
        
        return depth;
    }
};

3.翻转二叉树

在这里插入图片描述
思路分析:这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root 为根节点的整棵子树的翻转。

具体实现代码(详解版):

/**
 * 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:
    TreeNode* invertTree(TreeNode* root) {
        // 1. 基础情况:如果当前节点为空,返回 nullptr。
        if (!root) return nullptr;
        
        // 2. 递归翻转当前节点的左子树,将翻转后的左子树的根节点存储在 left。
        TreeNode* left = invertTree(root->left);
        
        // 3. 递归翻转当前节点的右子树,将翻转后的右子树的根节点存储在 right。
        TreeNode* right = invertTree(root->right);
        
        // 4. 交换左右子树,使当前节点的左子树指向翻转后的右子树。
        root->left = right;
        
        // 5. 使当前节点的右子树指向翻转后的左子树。
        root->right = left;
        
        // 6. 返回当前节点(作为翻转后的树的根节点)
        return root;
    }
};

4.对称二叉树

在这里插入图片描述
思路分析:递归,如果同时满足下面的条件,两个树互为镜像:

  • 它们的两个根结点具有相同的值
  • 每个树的右子树都与另一个树的左子树镜像对称
  • 通过「同步移动」两个指针的方法来遍历这棵树,left指针和 right指针一开始都指向这棵树的根,随后 left 右移时,right 左移,left 左移时,right右移。每次检查当前left 和 right 节点的值是否相等,如果相等再判断左右子树是否对称。

具体实现代码(详解版):

/**
 * 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 isSymmetric(TreeNode* root) {
        // 若根节点为空,直接认为是对称的
        if (!root) return true;
        // 使用递归检查左右子树是否镜像
        return isMirror(root->left, root->right);
    }

private:
    bool isMirror(TreeNode* left, TreeNode* right) {
        // 如果左右节点都为空,说明对称
        if (!left && !right) return true;
        // 如果只有一个节点为空,则不对称
        if (!left || !right) return false;
        // 两个节点值相同,且左节点的左子树与右节点的右子树对称,左节点的右子树与右节点的左子树对称
        return (left->val == right->val) &&
               isMirror(left->left, right->right) &&
               isMirror(left->right, right->left);
    }
};

5.二叉树的直径
在这里插入图片描述
思路分析:递归法,左右子树高度之和就是经过当前节点的当前最大直径

具体实现代码(详解版):

/**
 * 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:
    int diameterOfBinaryTree(TreeNode* root) {
        // 初始化最大直径
        int diameter = 0;
        // 计算树的高度并更新直径
        height(root, diameter);
        return diameter;
    }
    
private:
    // 递归计算树的高度,并更新直径
    int height(TreeNode* node, int& diameter) {
        // 基础情况:如果当前节点为空,返回 0
        if (!node) return 0;
        
        // 递归计算左子树和右子树的高度
        int leftHeight = height(node->left, diameter);
        int rightHeight = height(node->right, diameter);
        
        // 更新直径为左右子树高度之和
        diameter = max(diameter, leftHeight + rightHeight);
        
        // 返回当前节点的高度
        return 1 + max(leftHeight, rightHeight);
    }
};

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

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

相关文章

LLC电路 - 变压器匝比改变时的连锁反应

1.谐振电路等效电阻Rac 等效电阻从负载一侧映射过来&#xff0c;假定负载电阻为R&#xff0c;功率计算公式为U_out^2/R&#xff0c;则理想变压器因为Uin N*Uout&#xff0c;所以等效电阻的阻值变化是平方关系&#xff1a;Rref K*R*N^2.具体的计算公式为&#xff1a; Vp为变压…

Podman+Minikube:MacBook 运行 Kubernetes 最佳实践

简介 在现代软件开发中&#xff0c;Kubernetes作为容器编排的事实标准&#xff0c;已成为云原生应用的核心组成部分。对于开发者来说&#xff0c;在本地环境中搭建和测试Kubernetes集群显得尤为重要。而在这方面&#xff0c;结合MacBook、Podman和Minikube的组合&#xff0c;提…

【制造业&盒子】食品物品检测系统源码&数据集全套:改进yolo11-MultiSEAMHead

改进yolo11-efficientViT等200全套创新点大全&#xff1a;食品物品检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或…

性价比高的宠物净化器推荐!铲屎官们双十一不容错过的必备好物

秋天到了&#xff0c;我家毛孩子又开始爆毛&#xff01;一点都没有夸张&#xff0c;不仅家里到处都是它掉的毛&#xff0c;而且它自己也“膨胀”起来&#xff0c;身上都是脱落的毛发。 有时候没来得及清理&#xff0c;风一吹那些浮毛就飘到空气当中&#xff0c;呼吸的时候都感…

创建线程池时为什么不建议使用Executors进行创建

有没有想过为什么在创建线程池的时候我们一般都是通过ThreadPoolExecutor来创建线程池&#xff0c;很少使用Executors来创建线程池&#xff1f; 实践出真知&#xff0c;让我们具体在代码里面看看是什么原因~ 我们先用Executors来创建一个固定线程的线程池&#xff1a; Testpub…

基于STM32+华为云IOT设计的大棚育苗管理系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】NBIOT-BC26模块【2】MQ135传感器【4】SHT30传感器【5】B1750传感器 二…

树莓集团:智慧园区的绿色生态与可持续发展

智慧园区作为现代信息技术与园区管理深度融合的新兴概念&#xff0c;已然成为当下备受瞩目的发展热点。简单来讲&#xff0c;它借助各类智能技术手段&#xff0c;全方位提升园区的管理、服务效率以及居住体验&#xff0c;绝非仅仅局限于一个物理空间&#xff0c;而是打造出一个…

心情追忆- AI dify工具

之前我独自开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。 项目需求来源->设计->前端(小程序)->后端->部署均由我一人完成. 上线一个月. 通过群聊分享等. 用户量也有了100多人. 我希望持续发展. 然后今天又产生了一…

.net framework 3.5sp1开启错误进度条不动如何解决

浏览器地址栏输入www.dnz9.com远程解决netframework问题 在Windows操作系统上安装或启用.NET Framework 3.5 SP1时&#xff0c;如果遇到进度条不动的问题&#xff0c;可能由多种原因引起。以下是一些可能的解决方案&#xff1a; 1. 使用Windows功能对话框 1.打开“控制面板”。…

微信小程序之流浪动物救助:爱与希望同行

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

深度解析:Android APP集成与拉起微信小程序开发全攻略

目录 一、背景以及功能介绍 二、Android开发示例 2.1 下载 SDK 2.2 调用接口 2.3 获取小程序原始Id 2.4 报错提示&#xff1a;bad_param 2.4.1 错误日志 2.4.2 解决方案 相关推荐 一、背景以及功能介绍 需求&#xff1a;产品经理需要APP跳转到公司的小程序(最好指定页…

linux 安装php扩展:xlswriter

这里以xlswriter扩展为例 进入官方扩展&#xff1a;https://pecl.php.net查询自己php对应版本的扩展包 下载扩展 wget https://pecl.php.net/get/xlswriter-1.5.5.tgz 解压扩展 tar -zxvf xlswriter-1.5.5.tgz 进入扩展目录 cd xlswriter-1.5.5 查找对应php版本的phpiz…

【99.9%解决】vue3+vite+typescript+vscode使用@alias路径别名配置不正确导致红色波浪线的解决办法

相信很多人设置了别名“”后在编辑器内产生了大量的红色波浪线&#xff0c;警告无法读取相关模块。网上针对这个问题都没有好好分析原因&#xff0c;并且提供真正理解之下的解决方案。我在历经各种失败后&#xff0c;总结出这篇文章&#xff0c;希望对大家有所帮助。 当然我因为…

Qt限制QGraphicsScene QGraphicsItem内部的移动范围

用过QGraphicsView的都知道&#xff0c;原点一般设定在view和item的中心&#xff0c;所以帮助文档和这个网友说的不一定跟我们对的上&#xff1a; 关于Qt限制QGraphicsScene内部Item的移动范围_qgraphicsitem限制移动范围-CSDN博客 首先&#xff0c;设定view的scenerect&…

前端 react 面试题(二)

文章目录 hooks的使用规则为什么hooks要确保在函数组件的最顶层,而不能放置在循环或者条件语句中。react的事件模型react的合成事件是如何实现的react事件传参,可以使用箭头函数或bind方法,这两种哪一种更好使用箭头函数:使用`bind`方法:react的事件模型和vue的区别React …

在IDEA2024中生成SpringBoot模板

1、创建新项目 根据自己想要创建的工程类型选择&#xff0c;这里创建的时web工程 生成项目&#xff1a; 注意&#xff1a;SpringBoot只会扫描主程序所在的包及其下面的子包

(实战)WebApi第10讲:Swagger配置、RESTful与路由重载

一、Swagger配置 1、导入SwashBuckle.AspNetCore包 2、在.NET Core 5框架里的startup.cs文件里配置swagger 3、在.NET Core 6框架里的Program.cs文件里配置swagger 二、RESTful风格&#xff1a;路由重载&#xff0c;HttpGet()括号中加参数 &#xff08;1&#xff09;原则&…

【AI工作流】Coze - 知识库全面指南:功能、应用场景及使用方法详解

文章目录 Coze知识库介绍功能概述应用场景更多文章功能特性丰富的数据源灵活的内容分割 使用限制创建并使用知识库 创建知识库并上传文本内容创建知识库并上传表格数据 维护知识库内容管理知识库管理分段单个分段操作&#xff1a;使用知识库在工作流内使用 Knowledge 节点 更多…

SWAT-MODFLOW地表水与地下水耦合实践技术

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

基于Matlab的图像去噪算法仿真

在信息化的社会里&#xff0c;图像在信息传播中所起的作用越来越大。所以&#xff0c;消除在图像采集和传输过程中而产生的噪声&#xff0c;保证图像受污染度最小&#xff0c;成了数字图像处理领域里的重要部分。 本文主要研究分析邻域平均法、中值滤波法、维纳滤波法及模糊小…