LeetCode 热题 100 | 二叉树(一)

目录

1  基础知识

1.1  先序遍历

1.2  中序遍历

1.3  后序遍历

2  94. 二叉树的中序遍历

3  104. 二叉树的最大深度

4  226. 翻转二叉树

5  101. 对称二叉树


菜鸟做题,语言是 C++

1  基础知识

二叉树常见的遍历方式有:

  • 先序遍历
  • 中序遍历
  • 后序遍历
  • 深度优先遍历 = 先序遍历
  • 广度优先遍历 = 层次遍历(后面有道题)

其实稍微观察一下就可以发现,“先序”、“中序”、“后序” 针对的是根节点的位置。即在 (根节点,左子树,右子树) 这个三元组中,根节点处于哪个位置。

1.1  先序遍历
  1. 根节点
  2. 根节点的左子树
  3. 根节点的右子树
vector<int> ans;
void preorder(TreeNode* root) {
    if (!root) return;

    ans.push_back(root->val);
    preorder(root->left);
    preorder(root->right);
}

这个例子包括后面的两个例子,都是按照指定顺序遍历二叉树,同时将每个节点的值放入到容器 ans 中。

1.2  中序遍历
  1. 根节点的左子树
  2. 根节点
  3. 根节点的右子树
vector<int> ans;
void inorder(TreeNode* root) {
    if (!root) return;

    inorder(root->left);
    ans.push_back(root->val);
    inorder(root->right);
}

1.3  后序遍历
  1. 根节点的左子树
  2. 根节点的右子树
  3. 根节点
vector<int> ans;
void postorder(TreeNode* root) {
    if (!root) return;

    postorder(root->left);
    postorder(root->right);
    ans.push_back(root->val);
}

2  94. 二叉树的中序遍历

属于中序遍历(显然)

通过第 1 节的介绍,想必解决这个问题就很容易了。需要注意的是,我们的递归可以不需要返回值,因此需要额外写一个返回值为 void 的函数(但貌似你每次都返回一个 vector<int> 也行得通)

class Solution {
public:
    void inorder(TreeNode* root, vector<int>& ans) {
        if (!root) return;

        inorder(root->left, ans);
        ans.push_back(root->val);
        inorder(root->right, ans);
    }

    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        inorder(root, ans);
        return ans;
    }
};

3  104. 二叉树的最大深度

属于后序遍历:先获得左右子树的最大深度,再获得本子树的最大深度

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (!root) return 0;

        int leftMaxDepth = maxDepth(root->left);
        int rightMaxDepth = maxDepth(root->right);
        return 1 + max(leftMaxDepth, rightMaxDepth);
    }
};

精简版:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (!root) return 0;

        return 1 + max(maxDepth(root->left), maxDepth(root->right));
    }
};

4  226. 翻转二叉树

属于先序遍历

解题思路:

  1. 完成当前节点的翻转
  2. 完成其左右子树的翻转
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (!root) return nullptr;

        TreeNode * temp = root->right;
        root->right = root->left;
        root->left = temp;
        invertTree(root->left);
        invertTree(root->right);

        return root;
    }
};

这道题就没有单独写一个返回值为 void 的函数,虽然递归期间的返回值都没有派上用场,但是最重要的是最后一个返回值,它返回的是整棵二叉树的根节点,符合本题对返回值的要求。

5  101. 对称二叉树

属于先序遍历;少有的参数需要传两个指针的题

解题思路:

  1. 判断左右对称位置上的两个节点是否都存在
  2. 判断这两个节点的值是否相等
  3. 判断这两个节点的左右子树是否对称

思路说明图:

  • 对称位置上的两个节点进行比较,即左侧的 “2” 和右侧的 “2”
  • 左侧的 “2” 的左子树和右侧的 “2” 的右子树进行比较
  • 左侧的 “2” 的右子树和右侧的 “2” 的左子树进行比较
class Solution {
public:

    bool check(TreeNode * p, TreeNode * q) {
        if (!p && !q) return true;
        if (!p || !q) return false;

        return p->val == q->val &&
               check(p->left, q->right) && check(p->right, q->left);
    }

    bool isSymmetric(TreeNode* root) {
        return check(root->left, root->right);
    }
};

说明:

if (!p && !q) return true;
if (!p || !q) return false;

第一行判断是指,当 p 和 q 都为空指针时,属于是对称的情况;第二行判断是指,当 p 和 q 中只有一方为空指针时,属于是非对称的情况。

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

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

相关文章

C#,动态规划(DP)模拟退火(Simulated Annealing)算法与源代码

1 模拟退火 *问题:**给定一个成本函数f:r^n–>r*&#xff0c;找到一个 n 元组&#xff0c;该元组最小化 f 的值。请注意&#xff0c;最小化函数值在算法上等同于最大化(因为我们可以将成本函数重新定义为 1-f)。 很多有微积分/分析背景的人可能都熟悉单变量函数的简单优化。…

Python读取.nc数据并提取指定时间、经纬度维度对应的变量数值

本文介绍基于Python语言的netCDF4库&#xff0c;读取.nc格式的数据文件&#xff0c;并提取指定维&#xff08;时间、经度与纬度&#xff09;下的变量数据的方法。 我们之前介绍过.nc格式的数据&#xff0c;其是NetCDF&#xff08;Network Common Data Form&#xff09;文件的扩…

vue 中实现音视频播放进度条(满足常见开发需求)

由于开发需要&#xff0c;作者封装了一个音视频播放进度条的插件&#xff0c;支持 vue2 及 vue3 &#xff0c;有需要的朋友可联系作者&#xff0c;下面是对该款插件的介绍。 插件默认样式&#x1f447;&#xff08;插件提供了多个配置选项&#xff0c;可根据自身需求进行个性化…

临时内核映射

临时内核映射与永久内核映射的区别是&#xff0c;临时内核映射可以在中断处理程序和可延迟函数内部使用&#xff0c;它不堵塞当前进程。 一 原理介绍 临时内核映射的线性地址在永久内核映射的后面&#xff0c;范围是[FIXADDR_START, FIXADDR_TOP)&#xff0c;其基本逻辑是获取…

Zookeeper分布式一致性协议ZAB源码剖析

Zookeeper分布式一致性协议ZAB源码剖析 ZAB协议 ZK的强一致性 ZK严格来讲并不是实时强一致性&#xff0c;而是写时强一致性&#xff0c;读时顺序一致性 ZAB协议(原子广播协议)&#xff0c;Paxos算法的一种简化实现&#xff0c;包括两种基本模式 消息广播 消息广播过程中使用类…

“IT行业职业发展的黄金之路:哪些证书能为你增光添彩?“

文章目录 每日一句正能量前言1、浙大计算机程序设计能力考试证书&#xff08;PAT&#xff09;2、全国计算机等级考试证书(NCRE)3、计算机技术与软件专业资格考试证书&#xff08;软考&#xff09;4、通信专业技术人员职业水平证书5、全国计算机应用水平考试证书&#xff08;NIT…

优秀实践| 运营商核心系统国产数据库迁移实践

作者介绍 陕西移动信息技术部 张云川 陕西移动信息技术部 王永强 新炬网络中北三部 张建 随着国家对自主可控战略的深入推进&#xff0c;笔者所在省份聚焦数据库国产化替换&#xff0c;全面加速数据库国产化替换进程。以核心系统带动周边系统&#xff0c;成功在能力运营中…

详解 CSS 的背景属性

详解 CSS 的背景属性 背景颜色 语法&#xff1a; background-color: [指定颜色]; 注&#xff1a;默认是 transparent (透明) 的&#xff0c;可以通过设置颜色的方式修改 示例代码: 运行效果: 背景图片 语法&#xff1a;background-image: url(...); url 可以是绝对路径 也可…

【Java程序设计】【C00284】基于Springboot的校园疫情防控管理系统(有论文)

基于Springboot的校园疫情防控管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园疫情防控系统 本系统分为系统功能模块、管理员功能模块以及学生功能模块。 系统功能模块&#xff1a;在系统首页可以查…

后端经典面试题合集

目录 1. Java基础1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f;1-2. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f; 1. Java基础 1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f; JDK 是Java开发工具包&am…

使用 kind 集群安装运行极狐GitLab Runner【下】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 上一篇内容中&#xff0c;我们已经利用 kind 创建好了一个本地…

瑞_23种设计模式_装饰者模式

文章目录 1 装饰者模式&#xff08;Decorator Pattern&#xff09;1.1 介绍1.2 概述1.3 装饰者模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析5 总结5.1 装饰者模式的优缺点5.2 装饰者模式的使用场景5.3 装饰者模式 VS 代理模式 &#x…

Java日志技术

概况 把程序运行的信息&#xff0c;记录到文件中&#xff0c;方便程序员定位bug&#xff0c;并了解程序的执行情况等 什么是日志 好比生活中的日记&#xff0c;可以记录你生活中的点点滴滴程序中的日志&#xff0c;通常就是一个文件&#xff0c;里面记录的是程序运行过程中的…

第四十回 宋江智取无为军 张顺活捉黄文炳-使用python集合计算人员变动

白龙庙聚会&#xff0c;梁上好汉人多势众&#xff0c;听说江州城里军队追赶过来了&#xff0c;大家一起出去迎敌。李逵一马当先杀入人群&#xff0c;花荣一箭射倒领头的马军&#xff0c;其它马军掉头就走&#xff0c;把自己的步兵冲倒了一半。大家一直杀到江州城边&#xff0c;…

Android | ArcGIS入门

一、概述 ArcGIS是由Esri开发的地理信息系统&#xff08;GIS&#xff09;软件。它用于制图、空间分析和数据可视化。ArcGIS允许用户以各种格式创建、管理、分析和共享地理信息。它通常用于城市规划、环境管理和应急响应等领域。该软件包括一系列工具&#xff0c;用于创建地图、…

KTV点歌系统vue+springboot音乐歌曲播放器系统

目前现有的KTV点歌系统对于用户而言其在线点歌流程仍然过于繁琐&#xff0c;对于歌曲而言其系统安全性并不能保障。同时整套系统所使用的技术相对较为落后&#xff0c;界面不能动态化展示。相比较于其它同类型网站而言不能体现技术先进性。 1.2 项目目标 KTV点歌系统的后台开发…

C语言调试

目录 一.Debug和Release介绍 二.Windows环境调试介绍 三.窗口介绍 &#xff08;1&#xff09;自动窗口和局部变量窗口 &#xff08;2&#xff09;监视窗口 &#xff08;3&#xff09;调用堆栈 &#xff08;4&#xff09;查看汇编信息 &#xff08;5&#xff09;查看寄存…

Linux笔记之LD_LIBRARY_PATH详解

Linux笔记之LD_LIBRARY_PATH详解 文章目录 Linux笔记之LD_LIBRARY_PATH详解1.常见使用命令来设置动态链接库路径2.LD_LIBRARY_PATH详解设置 LD_LIBRARY_PATH举例注意事项 3.替代方案使用标准路径编译时指定链接路径优先使用 rpath 还是 runpath&#xff1f;注意事项 1.常见使用…

四信AI智能识别及计量监测设备,助力入河入海排污口规范化建设

随着城市化和工业化的快速发展&#xff0c;污水排放已成为主要的环境问题之一。2022年&#xff0c;国务院办公厅发布《关于加强入河入海排污口监督管理工作的实施意见》&#xff0c;提出“加强科技研发&#xff0c;开展各类遥感监测、水面航测、水下探测、管线排查等实用技术和…

Curator基本使用

文章目录 1. 基本操作1.1 建立连接1.2 创建结点1.3 查询结点查询数据查询子结点查看结点信息 1.4 修改结点普通修改带乐观锁的修改 1.5 删除删除单个结点删除带子结点的结点必须成功的删除带回调函数的删除 2. 监听器事件2.1 NodeCache单一结点连续监听2.2 PathChildrenCache监…