代码随想录算法训练营:14/60

news2024/11/17 13:41:56

非科班学习算法day14 | LeetCode266:翻转二叉树 ,Leetcode101: 对称二叉树,Leetcode100:相同的的树 ,LeetCode572:另一颗树的子树,LeetCode104:二叉树的最大深度,LeetCode559:N叉树的最大深度

目录

介绍

一、基础概念补充:

1.二叉树的深度和高度  

二、LeetCode题目

1.Leetcode226: 翻转二叉树

题目解析

2.Leetcode101: 对称二叉树

题目解析

3.Leetcode100:相同的树 

题目解析

4.Leetcode572:另一棵树的子树 

题目解析

5.Leetcode104: 二叉树的最大深度

题目解析

6.Leetcode559: N叉树的最大深度

题目解析

总结


介绍

包含LC的几道题目,还有相应概念的补充。

相关图解和更多版本:

代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、基础概念补充:

1.二叉树的深度和高度  

代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0104.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%A4%A7%E6%B7%B1%E5%BA%A6.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

二、LeetCode题目

1.Leetcode226: 翻转二叉树

题目链接:226. 翻转二叉树 - 力扣(LeetCode)

题目解析

       单层逻辑:交换左右两个孩子节点,所以采用后序遍历或者前序遍历都可以。

如果是采用层序遍历就要把每一层的结果记录之后反转。

递归C++代码如下:

/**
 * 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) {
        if (!root)
            return root;
        invertTree(root->left);
        invertTree(root->right);
        swap(root->left, root->right);

        return root;
    }
};

层序遍历c++代码如下: 

/**
 * 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) 
    {
        //层序遍历
        //建立辅助队列
        queue<TreeNode*> que;

        //插入根节点
        if(root != nullptr) 
        {
            que.push(root);
        }
        //初始化size
        int size = que.size();

        //层序遍历
        while(!que.empty())
        {
            while(size--)
            {
                //记录当前头节点
                TreeNode* cur_node = que.front();

                //弹出
                que.pop();

                //交换左右子节点
                swap(cur_node->left, cur_node->right);

                //加入当前左右节点
                if(cur_node->left != nullptr) que.push(cur_node->left);
                if(cur_node->right != nullptr) que.push(cur_node->right);
            }

            //更新size
            size = que.size();
        }
        
        //
        return root;
    }
};

2.Leetcode101: 对称二叉树

题目链接:101. 对称二叉树 - 力扣(LeetCode)

题目解析

       首先就是一个误区就可能会默认把root的情况作为中止条件,那么不难发现,这样就可能需要回溯再比较节点的信息,实际上并没有这么复杂,依托示例给出的三层树就可以发现可以利用子节点的状态来分别检查左右两棵子树的信息,进而可以比较是否相同。

递归C++代码如下: 

/**
 * 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 dfs(TreeNode* left, TreeNode* right) {
        if (left == nullptr && right == nullptr)
            return true;

        if (left != nullptr && right != nullptr && left->val == right->val) {
            // dfs(left->left, right->right);
            // dfs(left->right, right->left);
            return (dfs(left->left, right->right) &&
                    dfs(left->right, right->left));
        }

        return false;
    }
    bool isSymmetric(TreeNode* root) {
        if (!root)
            return true;
        return dfs(root->left, root->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 isSame(TreeNode* left, TreeNode* right)
    {
        if(!left&&!right)return true;
        else if(!left||!right) return false;
        else if(left->val != right->val) return false;
        else 
        {
            //检查外层
            bool outside = isSame(left->left, right->right);
            //检查内层
            bool inside = isSame(left->right, right->left);
            return outside&&inside;
        }
    }
    bool isSymmetric(TreeNode* root) 
    {
        return isSame(root->left, root->right);
    }
};

3.Leetcode100:相同的树 

题目链接:100. 相同的树 - 力扣(LeetCode)

题目解析

       101和572的思路和上面的题目的思路非常相近,细节处理不同罢了

递归C++代码如下: 

/**
 * 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 isSameTree(TreeNode* p, TreeNode* q) 
    {
        if(!p && !q) return true;
        
        else if(!p || !q) return false;
        else if(p->val != q->val) return false;
        
        //isSameTree(p->left, q->left);
        //isSameTree(p->right, q->right);
        else return bool(isSameTree(p->left, q->left)&&isSameTree(p->right, q->right));
    }
};

4.Leetcode572:另一棵树的子树 

题目链接:572. 另一棵树的子树 - 力扣(LeetCode)

题目解析

       101和572的思路和上面的题目的思路非常相近,细节处理不同罢了

递归C++代码如下: 

/**
 * 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 isSametree(TreeNode* root, TreeNode* subRoot) {
        if (!root && !subRoot)
            return true;
        else if (!root || !subRoot)
            return false;
        else if (root && root->val == subRoot->val)
            return (isSametree(root->left, subRoot->left) &&
                    isSametree(root->right, subRoot->right));
        else
            return false;
    }
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        if (!root)
            return false;
        if (isSametree(root, subRoot))
            return true;
        return isSubtree(root->left, subRoot) ||
               isSubtree(root->right, subRoot);
    }
};

5.Leetcode104: 二叉树的最大深度

题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)

题目解析

       把问题归结为最小单元,一层的二叉树,层数为一,最大深度为一;两层的二叉树,有左节点,没有右节点,最大深度为2......那么其实递推的过程就是在看左右最大路径然后返回这个值。

层序迭代C++代码如下:

/**
 * 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 maxDepth(TreeNode* root) {
        // 建立辅助队列
        queue<TreeNode*> que;

        // 初始化层数
        int count = 0;

        // 插入根节点
        if (root != nullptr) {
            que.push(root);
        }

        // 初始化size
        int size = que.size();

        // 层序遍历求取层数
        while (!que.empty()) {
            while (size--) {
                // 保存头节点信息
                TreeNode* cur_node = que.front();

                // 弹出头节点
                que.pop();

                // 加入弹出节点的左右子节点
                if (cur_node->left != nullptr)
                    que.push(cur_node->left);
                if (cur_node->right != nullptr)
                    que.push(cur_node->right);
            }

            // 记录层数
            count++;

            // 更新size
            size = que.size();
        }
        return count;
    }
};

 递归c++代码如下:

/**
 * 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 maxDepth(TreeNode* root) 
    {
        //设置递归中止出口
        if(root == nullptr) return 0;

        //后序遍历递归体
        int depth_L = maxDepth(root->left);
        int depth_R = maxDepth(root->right);
        int maxdepth = max(depth_L, depth_R) + 1;
        return maxdepth;
    }
};

 简洁版:

/**
 * 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 maxDepth(TreeNode* root) {
        // 设置递归中止出口
        if (root == nullptr)
            return 0;

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

注意点:在LeelCode中深度是按照节点数量算的,而不是边的数量。

6.Leetcode559: N叉树的最大深度

题目链接:559. N 叉树的最大深度 - 力扣(LeetCode)

题目解析

       和二叉树最大的不同就是如何把多个分支都写出来。

递归C++代码如下:

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

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

        for (auto child : root->children) {
            cur_depth = max(cur_depth, maxDepth(child));
        }
        return cur_depth + 1;
    }
};

总结


补打卡第14天,坚持!!!

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

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

相关文章

将产品制作成3D模型在网站上展示需要多少费用?

将产品制作成3D模型并在网站上展示的费用会因多种因素而异&#xff0c;包括模型的复杂度、所需的细节程度、制作3D模型的软件和工具、以及是否需要专业设计师的服务等。此外&#xff0c;不同的3D模型制作服务提供商可能会有不同的定价标准。 如果能自己制作3D模型&#xff0c;…

精益生产推进时如何营造持续变革的氛围?

在快速变化的市场环境中&#xff0c;企业如何保持竞争力&#xff1f;精益生产无疑为众多企业提供了一个强大的战略工具。但是&#xff0c;单纯的引入精益生产理念和方法并不能保证企业的持续成功。关键在于如何营造一种持续变革的氛围&#xff0c;让精益生产成为推动企业不断前…

职升网:咨询工程师可以的工作都有啥?

(1)经济社会发展规划、计划咨询; (2)行业发展规划和产业政策咨询; (3)经济建设专题咨询; (4)投资机会研究; (5)工程项目建议书的编制; (6)工程项目可行性研究报告的编制; (7)工程项目评估; (8)工程项目融资咨询&#xff0c;绩效追综评价&#xff0c;后评价及培训咨询服务…

零信任价值获全面认可 新场景下展现无穷潜力

2023年&#xff0c;零信任在全球范围内持续快速发展&#xff0c;已经从新的安全理念发展成为云时代的主流安全架构&#xff0c;进入了全面普及期。 2023年&#xff0c;中国零信任市场同样涨势迅猛&#xff0c;产业生态越来越成熟&#xff0c;应用范围越来越广&#xff0c;应用…

【数据库】oracle安装步骤(详细)

目录 1.下载oracle安装包 2.解压文件后&#xff0c;找到可执行安装文件【 setup.exe 】双击安装。如图&#xff1a; 3.安装第一步&#xff1a;配置安全更新&#xff0c;这步可将自己的电子邮件地址填写进去&#xff08;也可以不填写&#xff0c;只是收到一些没什么用的邮件而…

高中数学:不等式-常用不等式知识点汇总

一、基本性质 比较大小的常用两种方法&#xff1a;作差法&#xff0c;作商法 等式性质 不等式性质 二、基本(均值)不等式 扩展 三、二次函数与一元二次方程不等式 定义 解的对应关系 一元二次不等式的求解过程 四、二元一次不等式(组)与线性规划 关键在于求多个不等…

第2章.现场设备的物联网模式--设备网关

第2章.现场设备的物联网模式 本章列出了与现场设备或事物相关的关键模式。阅读本章后&#xff0c;您将能够识别物联网架构中这些模式的存在。它提供了有关模式适合或适用的场景的详细信息&#xff0c;以及需要考虑的约束。这将帮助您相对轻松地理解现有的物联网架构。 本章涵盖…

Linux系统查询磁盘空间大小(df、du)

df命令是linux系统以磁盘分区为单位查看文件系统&#xff0c;可以加上参数查看磁盘剩余空间信息&#xff0c; 命令格式&#xff1a;df -hl 显示格式为&#xff1a; Filesystem(文件系统) Size(容量) Used(已用) Avail(可用) Use%(已用%) Mounted on(挂载点) 命令使用详细介绍 …

探索未来驾驶新纪元:加油App开发,您的智能出行助手

一、前言 随着科技的快速发展和人们生活节奏的加快&#xff0c;传统加油方式已逐渐无法满足现代驾驶者的需求。为了满足广大驾驶者的便捷、高效、智能的加油体验&#xff0c;我们倾力打造了一款全新的加油App&#xff0c;让您的出行更加轻松、愉快。 二、产品特色 智能导航&…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP3308(SPI接口)的8通道ADC转换器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、时钟配置: 2)、USART配置: 四、软件部分: 1)、主功能函数: 2)、初始化部分: /* USER CODE BEGIN Header */ /** ******************************************************************************

ZYNQ学习教程?ZYNQ-FPGA实战教程!

学习 ZYNQ 比FPGA、MCU、ARM 等传统工具开发要求更高&#xff0c;想学好 ZYNQ 也不是一蹴而就的事情。 学习 ZYNQ 要具备的技能&#xff1a; 1、 软件开发人员  计算机组成原理、 C、C语言、 计算机操作系统、tcl 脚本、良好的英语基础 2、 逻辑开发人员 计算机组成原理…

台球厅助教软件开发台球陪练系统源码助教陪练行业市场分析

市场分析 随着台球运动的普及和竞技水平的不断提升&#xff0c;台球助教市场也逐渐成为了一个备受关注的领域。然而&#xff0c;如何高效、规范地管理这一市场&#xff0c;确保助教质量&#xff0c;提升用户体验&#xff0c;成为了摆在我们面前的一大挑战。幸运的是&#xff0…

NewspaceGPT带你玩系列之美人鱼图表

这里写目录标题 注册一个账号&#xff0c;用qq邮箱&#xff0c;然后登录选一个可用的Plus&#xff0c;不要选3.5探索GPT今天的主角是开始寻梦美人鱼图表我选第一个试一下问&#xff1a;重新回答上面的问题&#xff0c;一切都用汉语重新生成一个流程图&#xff1a;生成一个网站登…

2024年03月Python六级真题+答案(中国电子学会 )

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 一、单选题(共25题&#xff0c;共50分) 1.以下选项中&#xff0c;创建类正确的是&#xff1f;&#xff08; &#xff09; A. class test1…

VUE大屏的开发过程(纯前端)

写在前面&#xff0c;博主是个在北京打拼的码农&#xff0c;工作多年做过各类项目&#xff0c;最近心血来潮在这儿写点东西&#xff0c;欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论和学习的问题可联系我&#xff1a;1…

AI-人工智能指数报告(四):科学、医学与教育

背景&#xff1a; 从2017年开始&#xff0c;斯坦福大学人工智能研究所&#xff08;HAI&#xff09;每年都会发布一份人工智能的研究报告&#xff0c;人工智能指数报告&#xff08;AII&#xff09;&#xff0c;对上一年人工智能相关的数据进行跟踪、整理、提炼并进行可视化。这份…

轨迹跟踪PID相关及前馈引入结果对比

1、前言&#xff1a; 记录下给定一段轨迹如何实现跟踪控制&#xff0c;主要使用几个经典的方法进行对比。一些讨论的部分在代码中的注释部分。 前馈控制可以在没有扰动和建模误差的理想条件下很好地跟踪期望输出&#xff0c;但在实际系统中&#xff0c;由于存在建模误差、外部扰…

解决微信小程序使用textarea输入框 type=“textarea“ 文本输入限制问题

出现的问题 type"textarea" 这个限制 微信小程序使用textarea , 输入字数大于140 时就输入不进去了 加入这个就解决了 maxlength"-1" <u-inputv-model"queryParams.orderIdTxt"border"true":focus"true":auto-height&q…

学Prompt提示词,手撕大模型

最近&#xff0c;ChatGPT在网络上广受欢迎&#xff0c;以其独特的吸引力吸引了众多用户争相体验。 然而&#xff0c;各用户在使用后的感受和效果大不相同。有的用户欢欣鼓舞&#xff0c;将其视作珍宝&#xff0c;有的用户则感到平淡无奇&#xff0c;无甚趣味。有人将其作为生活…