《LeetCode》——LeetCode刷题日记

news2024/11/25 0:22:32

本期,将给大家带来的是关于 LeetCode 的关于二叉树的题目讲解。

目录

(一)606. 根据二叉树创建字符串

💥题意分析 

💥解题思路

(二)102. 二叉树的层序遍历

💥题意分析

💥解题思路

(三)236. 二叉树的最近公共祖先

 💥题意分析

💥解题思路


(一)606. 根据二叉树创建字符串

首先,第一道题是关于 二叉树创建字符串的题,接下来我将一步步的分析带大家理解这道题!

题目如下 :👇

输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

 

输入:root = [1,2,3,null,4]
输出:"1(2()(4))(3)"
解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。

💥题意分析 

首先,我们还是先对题意进行简单的分析:

我们可以发现他不是把所有的输出都给用括号括起来,仔细观察发现而是有些直接省略了,具体省略的有以下几种情况:

  • 1、左右都为空——省略
  • 2、左为空,右不为空——不省略
  • 3、右为空,左不为空——省略

但是大家仔细观察可以发现,此时当我们按照上述方式去看示例时,发现跟题意对不上。个人觉得应该是题当时弄错了,本题的整体思路就如上述,具体应该如下才对:

  • 总之大概意思就是根据题意给出的二叉树的,我们按照合适的输出方案输出即可

💥解题思路

具体思路如下:

我们可以使用递归的方法得到二叉树的前序遍历,并且每次递归时加上相应的括号即可得到最终的结果。

  • 1、如果当前节点没有孩子(即左右都为空),此时则不需要在节点后面加上任何括号;

  • 2、如果当前节点只有左孩子,而右为空。那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号;

  • 3、对应的,如果当前节点只有右孩子,而左为空。那当我们在递归时,此时的括号就不难省略了。此时需要先加上一层空的括号表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。

 💥代码展示:

class Solution {
public:
    string tree2str(TreeNode* root) {
      if(root == nullptr)
      return "";
      
      //root->val不支持转成整形,因此这里加上to_string 即可实现转成字符串
      string str=to_string(root->val);
      //左为空,此时我们不能直接省略,还要看右边的情况
      if(root->left || root->right)
      {
          str+="(";
          str+=tree2str(root->left);
          str+=")";
      }

      if(root->right)
      {
        str+="(";
        str+=tree2str(root->right);
        str+=")";
      }

      return str;

    }
};
  • 最终结果:

 


(二)102. 二叉树的层序遍历

题目如下 :👇

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

示例 2:

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

示例 3:

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

💥题意分析

  • 本题的意思其实很简答,就是根据给出的二叉树,我们相当于层序遍历之后输出最后的结果即可!

💥解题思路

在这里我给出两种思路供大家参考:

1、我们定义两个队列。

  • 一个队列控制结点的指针,然后去控制层序遍历;
  • 另外一个队列则为一个整形,控制层数,即此时是第几层的在进行操作。

图解:

 2、我们只定义一个队列。

我们也可以定义一个队列进行操作:

此时我们还需要在定义一个变量,设为【levelsize】。目的是为了控制二叉树一层一层的出;

图解:


 

 💥代码展示:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
      queue<TreeNode*> str;
      int levelsize=0;
      if(root)
      {
          str.push(root);
          levelsize=1;
      }
      //控制每层的元素出队列
      vector<vector<int>>arry;
      while(!str.empty())
      {
          vector<int>v;
          //levelsize 为几就表示需要出几次
          while(levelsize--)
          {
              //先取对头的数据
              TreeNode* front=str.front();
              str.pop();
              v.push_back(front->val);
               
               //左不为空,把元素入队
              if(front->left)
               str.push(front->left);
                //右不为空,把元素入队
               if(front->right)
               str.push(front->right);
          }
          //每层出的元素放到相应的数组中
          arry.push_back(v);
          levelsize=str.size();
      }
      return arry;
    }
};
  • 最终结果:



(三)236. 二叉树的最近公共祖先

题目如下 :👇

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

 

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

 

 💥题意分析

  • 本题的大概意思就是题中给出两个节点,在二叉树中我们去找到这两个节点的公共父结点输出即可!

💥解题思路

思路一:

整体思路就是DFS求出p和q 的路径放到容器中,转换成路径相交。

我们用栈来充当这个容器,定义Ppath为当前节点左端的路径,qpath为右端的节点路径;

  • 图解:

  •  当我们成功的找到两端的路径之后,接下来就是判断步奏了:

 

 💥代码展示:

class Solution {
public:

bool Getpath(TreeNode* root,TreeNode* x,  stack<TreeNode*>& path)
{
    if( root == nullptr )  
        return false;
    
    path.push(root);
    if(root == x)
    return true;

    if(Getpath(root->left,x,path))
    return true;

    if(Getpath(root->right,x,path))
    return true;

    path.pop();
    return false;
}
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    stack<TreeNode*>Ppath,qpath;
    Getpath(root,p,Ppath);
    Getpath(root,q,qpath);

    while(Ppath.size() != qpath.size())
    {
        if(Ppath.size() > qpath.size())
        {
            Ppath.pop();
        }
        else
        qpath.pop();   
    }

     while(Ppath.top() != qpath.top())
     {
        Ppath.pop();
        qpath.pop();   
     }
     return Ppath.top();
    }
};
  • 最终结果:


思路二:

  1. 首先刚开始从根节点开始遍历,如果p和q中的任一个和root匹配,那么root就是最低公共祖先。
  2. 如果都不匹配,此时我们分别去递归左、右子树,如果有一个 节点出现在左子树,并且另一个节点出现在右子树,则root就是我们要找的值,即最低公共祖先
  3. 如果两个节点都出现在左子树,则说明最低公共祖先在左子树中,否则在右子树中。

 💥代码展示:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if( root == nullptr )
        {
           return nullptr;
        }
        //如果p和q中的任一个和root匹配,那么root就是最进公共祖先
        if( root == p || root == q )
        {
           return root;
        }
        //如果都不匹配,则分别递归左、右子树
       TreeNode* left = lowestCommonAncestor( root->left , p , q );
       TreeNode* right = lowestCommonAncestor( root->right , p , q );
       //如果有一个节点出现在左子树,并且另一个节点出现在右子树,则root就是最低公共祖先.
       if( left != nullptr && right != nullptr )
       {
           return root;
       } 
       //如果两个节点都出现在左子树,则说明最低公共祖先在左子树中,否则在右子树
       if( right == nullptr )
       {
           return left;
       } 
       return right; 
    }
};
  • 最终结果:


到此,便是本期题目的所有讲解内容了,希望对大家有所帮助!!!

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

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

相关文章

docker stats 命令详解

docker stats : 显示容器资源的使用情况&#xff0c;包括&#xff1a;CPU、内存、网络 I/O 等。 docker stats [OPTIONS] [CONTAINER...]OPTIONS 说明&#xff1a; –all , -a :显示所有的容器&#xff0c;包括未运行的。 –format :指定返回值的模板文件。 –no-stream :展…

( “树” 之 BFS) 637. 二叉树的层平均值 ——【Leetcode每日一题】

637. 二叉树的层平均值 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 1 0 − 5 10^{-5} 10−5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,1…

060202体积弧长-定积分在几何学上的应用-定积分的应用

文章目录 2 体积2.1 旋转体的体积2.2 平行截截面面积已知的立体的体积2.3 例题 3 平面曲线的弧长2.1 直接坐标系2.2 参数方程2.3 极坐标系 结语 2 体积 2.1 旋转体的体积 情形①平面图形由 y f ( x ) , y 0 , x a , x b yf(x),y0,xa,xb yf(x),y0,xa,xb所围成&#xff0c;…

LeetCode——1041. 困于环中的机器人

一、题目 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向是y轴的正方向。 南方向是y轴的负方向。 东方向是x轴的正方向。 西方向是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; “G”&#xff1a;直走 1 个单位 “L”…

seata1.5.2+nacos2.10配置教程

seata1.5.2配置教程本文基于nacos2.1.0mysql8.0seata1.5.21.下载安装包 官网&#xff1a;http://seata.io/zh-cn/blog/download.html seata目录结构如图&#xff1a; 2.主要需要修改的配置文件是\seata\conf\application.yml,可参考示例application.example.yml server:port:…

SpringBoot项目集成JMH测试用例

SpringBoot项目集成JMH测试用例1. JMH2. JMH使用2.1 pom引用JMH2.2 BaseBenchmark3. 部分注解介绍4. Jenkins 集成 JMH4.1 下载插件配置Job1. JMH JMH&#xff08;Java Microbenchmark Harness&#xff09;是一个 Java 工具&#xff0c;用于构建、运行和分析用 Java 和其他针对…

【redis】缓存双写一致性之工程落地实现(下)

【redis】缓存双写一致性之工程落地实现&#xff08;下&#xff09; 本篇由于没有进行实操&#xff0c;所以没有记录详细的配置内容 文章目录 【redis】缓存双写一致性之工程落地实现&#xff08;下&#xff09;本篇由于没有进行实操&#xff0c;所以没有记录详细的配置内容 前…

树莓派 GPIO口控制双色LED灯

目录 一、首先加载库 二、设置编码规范 三、去除GPIO口警告 四、进行详细编程 五、程序源码 GPIO&#xff08;General Purpose I/O Ports&#xff09;意思为通用输入/输出端口&#xff0c;通过它们可以输出高低电平或者通过它们读入引脚的状态&#xff08;是高电平或是低电…

Faster RCNN系列——RPN的真值详解

RPN的真值分为类别真值和偏移量真值&#xff0c;即每一个Anchor是否对应着真实物体&#xff0c;以及每一个Anchor对应物体的真实偏移值&#xff0c;这两种真值的具体求解过程如下图所示&#xff1a; Anchor生成 Anchor生成的具体过程可参考Faster RCNN系列——Anchor生成过程&a…

C++|引用篇

目录 引用概念 引用的用法 做函数形参 优点一 优点二 引用做返回值 让我们更深入的了解引用与指针 语法层引用与指针完全不同的概念 站在底层的角度看指针与引用 引用概念 在语言层面上&#xff1a;引用不是定义新的变量&#xff0c;而是给已存在变量再取一个别名&am…

Spring——读取和存储(包含五大注解,对象装配,注入关键字)

目录 一、创建Spring项目 1. 创建一个普通的maven项目 2. 添加Spring框架支持&#xff08;spring-context&#xff0c;spring-beans&#xff09; 3. 添加启动类 二、Bean对象的读取和存储——不使用注释版 1. 创建Bean 2. 将Bean注册到容器 3. 获取并使用Bean对象 3.1…

Faster RCNN系列——Anchor生成过程

一、RPN模块概述 RPN模块的输入、输出如下&#xff1a; 输入&#xff1a;feature map&#xff08;输入图像经过特征提取网络后得到的特征图&#xff09;、物体标签&#xff08;训练集中所有物体的类别和边框信息&#xff09;输出&#xff1a;Proposal&#xff08;生成的建议框…

KD-2125地下管线故障测试仪

一、产品概述 KD-2125电缆综合探测仪&#xff08;管线仪&#xff09;可进行地下电缆线路&#xff08;停电/带电&#xff09;和金属管道等敷设路径探测、识别、埋深测量&#xff1b;以及路灯电缆、地埋线路的故障查找等&#xff0c;同时也可进行地下带电线缆排查。该设备以其优越…

Android---内存性能优化

内存抖动 内存抖动是由于短时间内有大量对象进出新生区导致的&#xff0c;内存忽高忽低&#xff0c;有短时间内快速上升和下落的趋势&#xff0c;分析图呈锯齿状。 它伴随着频繁的 GC&#xff0c;GC 会大量占用 UI 线程和 CPU 资源&#xff0c;会导致 APP 整体卡顿&#xff08;…

07 dubbo源码学习_集群Cluster

1. 入口2. 源码分析2.1 FailbackClusterInvoker2.2 FailoverClusterInvoker 失败自动切换2.3 FailfastClusterInvoker 快速失败2.4 FailsafeClusterInvoker 失败安全2.4 FailsafeClusterInvoker 并行调用多个服务提供者,只要有一个返回,就立即响应3. 如何使用本篇主要介绍集群…

Python VTK STL 映射三维模型表面距离

目录 前言&#xff1a; 效果&#xff1a; 实现步骤&#xff1a; Code: 前言&#xff1a; 本文介绍了Python VTK映射三维模型表面距离&#xff0c;通过如何使用VTK计算两个三维模型(stl)的表面距离&#xff0c;并将其距离值以颜色映射到模型&#xff0c;可用于对比 两相模型…

智慧养老平台建设方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 1、 总体设计 1.1 建设原则 养老机构智能化管理工程是一项涉及多学科知识的复杂的系统工程&#xff0c;养老机构智能化管理围绕机构发展战略&#xff0c;立足机构需求&…

超星项目er图,进程

一.er图 二. 进程&#xff1a;发现之前的写的分类太乱而且服务端与客户端未分离&#xff0c;于是分离客户端与服务端&#xff0c;然后将客户端的界面三个程序整理放在三个包下&#xff0c;在服务端与客户端的数据交互方面采用序列化与反序列化进行功能判断采用以及数据传输&a…

WPF入门教程(六)--依赖属性(2)--属性值优先级与继承

一、 依赖属性的优先级 由于WPF 允许我们可以在多个地方设置依赖属性的值&#xff0c;所以我们就必须要用一个标准来保证值的优先级别。比如下面的例子中&#xff0c;我们在三个地方设置了按钮的背景颜色&#xff0c;那么哪一个设置才会是最终的结果呢&#xff1f;是Black、Re…

【论文阅读】On clustering using random walks

《On clustering using random walks》阅读笔记 1. 问题建模 1.1 问题描述 let G(V,E,ω)G(V,E,\omega)G(V,E,ω) be a weighted graph, VVV is the set of nodes, EEE is the edge between nodes in VVV, ω\omegaω is the function ω&#xff1a;E→Rn\omega&#xff1a…