代码随想录打卡第十四天

代码随想录–二叉树部分

day14 二叉树第二天


文章目录

  • 代码随想录--二叉树部分
  • 一、力扣226--反转二叉树
  • 二、力扣101--对称二叉树
  • 三、力扣104--二叉树的最大深度
  • 四、力扣111--二叉树的最小深度


一、力扣226–反转二叉树

代码随想录题目链接:代码随想录

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

递归法可以秒了

代码如下:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr) return root;
        swap(root->left, root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

二、力扣101–对称二叉树

代码随想录题目链接:代码随想录

给你一个二叉树的根节点 root , 检查它是否轴对称。

这道题用递归做的话,反而不太好写

因为要检查是否轴对称,所以其实迭代需要传入两颗树的root,比较两棵树是否对称

而仅在这两个root不为空且数字一样时,再进行下一步的检查

也就是递归检查左树的左节点和右树的右节点是否一样,以及左树的右节点和右树的左节点是否一样

代码如下:

class Solution {
public:
    bool checkThem(TreeNode * leftN, TreeNode * rightN)
    {
        if(leftN != nullptr && rightN == nullptr) return false;
        else if(leftN == nullptr && rightN != nullptr) return false;
        else if(leftN == nullptr && rightN == nullptr) return true;
        else if(leftN->val != rightN ->val) return false;

        bool outside = checkThem(leftN->left, rightN->right);
        bool inside = checkThem(leftN->right, rightN->left);
        return outside && inside;
    }
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        return checkThem(root->left, root->right);
    }
};

用遍历法写就会简单的多,一层一层地把元素入队,每次出两个比较,都一样且队空就是对称,否则不对称

代码如下:

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        queue<TreeNode*> checkQue;
        checkQue.push(root->left);
        checkQue.push(root->right);
        while(!checkQue.empty())
        {
            TreeNode * leftN = checkQue.front();
            checkQue.pop();
            TreeNode * rightN = checkQue.front();
            checkQue.pop();

            if(!leftN && !rightN) continue; // both nullptr
            else if(!leftN && rightN) return false;
            else if(leftN && !rightN) return false;
            else if(leftN->val != rightN->val) return false;

            checkQue.push(leftN->left);
            checkQue.push(rightN->right);
            checkQue.push(leftN->right);
            checkQue.push(rightN->left);
        }
        return true;
    }
};

附加题:力扣100–相同的树

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(!p && !q) return true;
        else if(!p && q) return false;
        else if(!q && p) return false;
        else if(p->val != q->val) return false;

        return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
    }
};

力扣572–另一颗树的子树,层序遍历+相同树判断

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(!p && !q) return true;
        else if(!p && q) return false;
        else if(!q && p) return false;
        else if(p->val != q->val) return false;

        return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
    }
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        queue<TreeNode *> que;
        que.push(root);
        while(!que.empty())
        {
            TreeNode * curr = que.front(); que.pop();
            if(isSameTree(curr, subRoot)) return true;
            if(curr->left) que.push(curr->left);
            if(curr->right) que.push(curr->right);
        }
        return false;
    }
};

三、力扣104–二叉树的最大深度

代码随想录题目链接:代码随想录

给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

第一反应就是层序遍历,每次遍历+1即可

代码如下:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        int depth = 0;
        if(!root) return depth;
        queue<TreeNode *> que;
        que.push(root);
        while(!que.empty())
        {
            int length = que.size();
            depth ++;
            for(int i = 0; i < length; i++)
            {
                TreeNode * curr = que.front(); que.pop();
                if(curr->left) que.push(curr->left);
                if(curr->right) que.push(curr->right);
            }
        }
        return depth;
    }
};

迭代法做也是可以的,迭代遍历左右树层数,选最大的那个,每层迭代向上返回时+1即可记录迭代层数

代码如下:

class Solution {
public:
    int getDepth(TreeNode * curr)
    {
        if(!curr) return 0;

        int leftDepth = getDepth(curr->left);
        int rightDepth = getDepth(curr->right);
        return 1+max(leftDepth, rightDepth);
    }
    int maxDepth(TreeNode* root) {
        return getDepth(root);
    }
};

可以简洁,但是为了方便回忆,就这么写吧

附加题:力扣559–N叉树的最大深度

class Solution {
public:
    int maxDepth(Node* root) {
       if(!root) return 0; 
       int depth = 0;
       queue<Node *> que;
       que.push(root);
       while(!que.empty())
       {
            int length = que.size();
            depth ++;
            for(int i = 0; i < length; i ++)
            {
                Node * curr = que.front(); que.pop();
                for(auto child : curr->children)
                {
                    if(child) que.push(child);
                }
            }
       }
       return depth;
    }
};

class Solution {
public:
    int maxDepth(Node* root) {
        if(!root) return 0;
        int depth = 0;
        for(auto child : root->children)
        {
            int curr_depth = maxDepth(child);
            depth = depth > curr_depth ? depth : curr_depth;
        }
        return depth + 1;
    }
};

四、力扣111–二叉树的最小深度

代码随想录题目链接:代码随想录

给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。

跟最大深度不同的是,返回时需要检查一下这个节点是否有左右树,如果是单侧树的话,不能单纯返回1+min的结果

只有该节点左右树都有或者都没有的情况下才能返回1+min,因为此时的节点才有可能是叶子节点

代码如下:

class Solution {
public:
    int getDepth(TreeNode * curr)
    {
        if(!curr) return 0;
        
        int leftDepth = getDepth(curr->left);
        int rightDepth = getDepth(curr->right);

        if(!curr->left && curr->right) return 1 + rightDepth;
        if(!curr->right && curr->left) return 1 + leftDepth;

        return 1 + min(leftDepth, rightDepth);
    }
    int minDepth(TreeNode* root) {
        return getDepth(root);
    }
};

迭代法:正常的层序遍历,但是在检查到第一个叶子节点的时候就return,下面的就不用遍历了

因为是一层一层的遍历,每次遍历都是同一层的叶子节点,也就无所谓是哪一个,深度是一样的

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root) return 0;
        int depth = 0;
        queue<TreeNode *> que;
        que.push(root);
        while(!que.empty())
        {
            int length = que.size();
            depth ++;
            for(int i = 0; i < length; i ++)
            {
                TreeNode * curr = que.front(); que.pop();
                if(curr->left) que.push(curr->left);
                if(curr->right) que.push(curr->right);
                if(!curr->left && !curr->right) return depth;
            }
        }
        return depth;
    }
};

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

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

相关文章

基于three.js的数字孪生项目,慢如老牛,7条优化技术。

基于three.js的数字孪生项目慢如老牛可能有以下几个地方可以提升&#xff1a; 优化模型加载&#xff1a; 数字孪生项目通常涉及复杂的3D模型&#xff0c;加载大型模型可能会导致性能下降。可以尝试使用压缩模型、使用LOD&#xff08;Level of Detail&#xff09;技术根据距离…

you should not run configure as root, 升级tar出错

为了能用 tar 支持 zstd 的压/解缩包命令&#xff0c;需要升级 tar 到 1.3 以上&#xff0c;下面是下载和编译、安装命令&#xff1a; wget https://mirrors.aliyun.com/gnu/tar/tar-1.32.tar.bz2 tar -jxvf tar-1.32.tar.bz2 cd tar-1.32 ./configure make make install但在执…

Pandas 学习笔记(四)--CSV文件

CSV文件 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。 读取与写入 读取csv文件 i…

202406 CCF-GESP Python 三级试题及详细答案注释

202406 CCF-GESP Python 三级试题及详细答案注释 1 单选题(每题 2 分,共 30 分)第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?( ) A. 1 B. 2 C. 3 D. 4答案:C解析:目前CCF组织的GESP认证考试有C++、Pyth…

Java语言程序设计——篇二(1)

Java语言基础 数据类型关键字与标识符关键字标识符 常量与变量1、常量2、变量 类型转换自动类型转换强制类型转换 数据类型 数据的基本要素数据的性质&#xff08;数据结构&#xff09;数据的取值范围&#xff08;字节大小&#xff09;数据的存储方式参与的运算 Java是一门强类…

权力之望怎么注册账号创建角色 权利之网角色账号注册教程

权力之望是一款全新的大型MMORPG游戏&#xff0c;拥有9把独特武器和56种职业组合&#xff0c;并搭配了超炫酷的战斗画面&#xff0c;全程采用低俯视角游戏&#xff0c;让玩家能体验到更强的操作感和爽快感。这款游戏主打高养成自由度玩家可以自由更换武器进行战斗&#xff0c;还…

MySQL之表的约束(下)

自增长 auto_increment&#xff1a;当对应的字段&#xff0c;不给值&#xff0c;会自动的被系统触发&#xff0c;系统会从当前字段中已经有的最大值 1操作&#xff0c;得到一个新的不同的值。通常和主键搭配使用&#xff0c;作为逻辑主键。 自增长的特点&#xff1a; 1. 任何一…

SSM慢性病患者健康管理系统-计算机毕业设计源码04877

目 录 摘要 1 绪论 1.1 研究意义 1.2研究目的 1.3论文结构与章节安排 2 慢性病患者健康管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分…

python语句性能分析

1、for语句性能优于while import timeif __name__ __main__:start_time time.time()for i in range(10 ** 8):passend_time time.time()run_time end_time - start_timeprint(run_time)i 0start_time time.time()while i < 10 ** 8:i 1end_time time.time()run_tim…

【CSAPP】-cachelab实验

目录 实验目的与要求 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 操作异常问题与解决方案 实验总结 实验目的与要求 1、掌握应用程序性能的优化方法&#xff1b; 2、理解存储器层次结构在程序运行过程中所起的重要作用&#xff1b; 3、让学生更好…

一网统管/视频汇聚/安防监控平台EasyCVR启动后无法访问是什么原因?

智慧城市/一网统管/视频汇聚/安防监控平台EasyCVR兼容性强&#xff0c;支持多协议接入&#xff0c;包括国标GB/T 28181协议、GA/T 1400协议、部标JT808协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等&#xff0c;并能对外分…

科普文:jvm实战(六)搞懂各个版本JDK和GC

jdk6&#xff0c;7&#xff0c;8三个版本的内存模型 如图所示 JDK 1.6、1.7、1.8 的内存模型演变过程&#xff0c;其实这个内存模型就是 JVM 运行时数据区依照JVM虚拟机规范的具体实现过程。 JDK 1.6&#xff1a;程序计数器、Java虚拟机栈、本地方法栈、堆、方法区[永久代]&am…

C++系列-String(四)String初步的模拟实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 下面的这些是我们这篇文章将要实现的String的功能&#xff1a; #pragma once #include<iostream> #include<assert.h> using namespace std;namespace bit {class…

下载程序到仿真

第一步&#xff0c;新建工程 第二步&#xff0c;设备组态 第三步&#xff0c;地址分配 需要注意的是&#xff0c;分配地址的范围&#xff0c;是CPU决定的。 关于常见数据类型 下载与仿真 一般安装好博图会自带。 PLCSIM/PLCSIM Advanced PLCSIM普通仿真 PLCSIM Advanced高级…

Spark 分布式弹性计算集(RDD)相关概念介绍

目录 一、概述 二、RDD的核心概念 2.1 Partition 2.2 Partitioner 2.3 RDD的依赖关系 2.4 Stage 2.5 PreferredLocation 2.6 CheckPoint 三、RDD的持久化 3.1 概述 3.2 概念 3.3 RDD持久化级别 3.3.1 MEMORY_ONLY 3.3.2 MEMORY_AND_DISK 3.3.3 MEMORY_ONLY_SER …

昇思第18天打卡|ShuffleNet图像分类

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

使用命令行修改Ubuntu 24.04的网络设置

Ubuntu里&#xff0c;使用命令行下修改IP地址&#xff0c;网上有很多方案&#xff0c;我最终觉得这个方案&#xff08;使用Netplan&#xff09;最好&#xff0c;最根本&#xff0c;记录下来备查 1.使用命令ip link show 查看Ubuntu上可以使用的网络接口名称 2.查找Netplan的配…

「Java开发指南」如何用MyEclipse完成Spring Web Flow 2.0搭建?

本教程将引导您完成Spring Web Flow的软件组件生成&#xff0c;这是Spring的一个项目&#xff0c;用于简化Web应用程序的开发。虽然Spring Web Flow与Spring MVC兼容&#xff0c;但Spring Web Flow使用流而不是控制器来实现应用程序的Web层。在本教程中&#xff0c;您将学习如何…

放大镜案例

放大镜 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>商品放大镜</title><link rel&qu…

可控硅整流自动恒流充电器设计制作

该充电器除可为各种镍镉电池充电外&#xff0c;也可为干电池充电。其充电电流可调。充电终止电压由RP1预先确定。 工作原理 电路原理见图1。开始充电时&#xff0c;电池组两端电压较低&#xff0c;不足以使晶体管VT导通。由RC组成的移相电路给可控硅提供触发电流。移相角度由R…