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

非科班学习算法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);}//初始化sizeint 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);}//更新sizesize = 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));elsereturn 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);}// 初始化sizeint 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++;// 更新sizesize = 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.mzph.cn/diannao/36322.shtml

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

相关文章

SDK 程序卡在 AXI DMA 配置 (XAxiDma_CfgInitialize)的解决方法

在进行 AXI DMA 配置 时候代码一直卡在XAxiDma_CfgInitialize函数出不来&#xff0c;也没有打印报错。 /* Initialize the XAxiDma device.*/CfgPtr XAxiDma_LookupConfig(DeviceId);if (!CfgPtr) {xil_printf("No config found for %d\r\n", DeviceId);return XST_…

ResNet-50算法

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、理论知识储备 1.CNN算法发展 AlexNet是2012年ImageNet竞赛中&#xff0c;由Alex Krizhevsky和Ilya Sutskever提出&#xff0c;在2012年ImageNet竞赛中&a…

头歌——机器学习——支持向量机案例

第1关&#xff1a;基于支持向量机模型的应用案例 任务描述 本关任务&#xff1a;编写一个基于支持向量机模型的应用案例。 相关知识 在本应用案例中&#xff0c;我们借助一个具体的实际问题&#xff0c;来完整地实现基于支持向量机模型的开发应用。在此训练中&#xff0c;我…

运筹系列93:VRP精确算法

1. MTZ模型 MTZ是Miller-Tucker-Zemlin inequalities的缩写。除了定义是否用到边 x i j x_{ij} xij​外&#xff0c;还需要定义一个 u i u_i ui​用来表示此时车辆的当前载货量。注意这里x变量需要定义为有向。 这里定义为pickup问题&#xff0c;代码为&#xff1a; using Ju…

windows下载jdk并安装步骤(保姆级教程)

一、下载jdk 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二、双击下载好的jdk 更改安装目录然后点击下一步 然后会弹出jre的安装&#xff0c;需要选择路径&#xff08;注意&#xff1a;这里的路径必须跟前面的jdk在…

将huggingface的大模型转换为safetensor格式

很多huggingface的大语言模型都是pytorch的格式&#xff0c;但是mindie需要safetensor格式&#xff0c;另外mindieservice加载原始的baichuan2-13b的模型出错&#xff0c;后来排查是bfloat16数据格式的问题&#xff0c;所以这次转换要一次性转为float16的格式。 上代码&#x…

计算机网络:如何隐藏真实的IP和MAC地址?

目录 一、什么是MAC地址二、什么是IP地址三、如何隐藏真实的MAC地址四、如何隐藏真实的IP地址 一、什么是MAC地址 MAC地址&#xff0c;全称为媒体访问控制地址&#xff08;Media Access Control Address&#xff09;&#xff0c;是一种用于网络通信的唯一标识符。它是由IEEE 8…

PLC网关如何选择?plc网关作用-天拓四方

一、PLC网关在工业自动化领域的重要性和作用 PLC网关在工业自动化领域的重要性和作用不言而喻。作为工业自动化系统的重要组成部分&#xff0c;PLC网关起到了关键的桥梁作用&#xff0c;实现了PLC与其他设备、系统之间的数据传输和通信。 首先&#xff0c;PLC网关的重要性体现…

最像人声的语音合成模型-ChatTTS

目录 写在前面 一、使用ChatTTS 二、优点 三、局限 写在前面 最像人声的AI来了&#xff01;语音开源天花板ChatTTS火速出圈&#xff0c;3天就斩获9k个star。截至发稿前&#xff0c;已经25.9k个star了。这是专门为对话场景设计的语音生成模型&#xff0c;用于LLM助手对话任务…

搭建抖音微短剧系统:源码部署与巨量广告回传全解析

在数字化浪潮中&#xff0c;抖音微短剧已成为内容创作的新宠。想要搭建一个高效的抖音微短剧系统&#xff0c;并实现与巨量广告的有效回传吗&#xff1f;本文将为您详细解析源码部署与广告回传的关键步骤。 一、源码部署&#xff1a;构建短剧系统的基石 源码是软件开发的起点…

vscode远程连接Ubantu

一、首先用VM虚拟机打开一个Linux系统 二、打开VScode 在扩展里安装 安装后&#xff0c;打开Linux查看IP地址 在VScode 中新建连接主机 输入linux_nameip地址 -A 然后输入Linux的登录密码 就可以远程操控 Linux了 可以在终端中远程控制Linux 点击左上角的打开文件夹可以很…

什么是 Azure OpenAI?

目录 一、说明 二、什么是 Azure OpenAI 2.1 网络结构 2.2 、为什么使用 Azure OpenAI 2.3 如何使用 Azure OpenAI 三、从哪里开始 Azure OpenAI 之旅 3.1 关于 Azure OpenAI&#xff0c;我还需要了解什么 3.2 RBAC 权限和角色 3.3 演示 1&#xff1a;在公共数据上应用…

聚合项目学习

首先建立一个总的工程目录&#xff0c;里边后期会有我们的父工程、基础工程(继承父工程)、业务工程&#xff08;依赖基础工程&#xff09;等模块 1、在总工程目录中&#xff08;open一个空的文件夹&#xff09;&#xff0c;首先建立一个父工程模块&#xff08;通过spring init…

4面体空间内直链4点结构分布与占比

在30个点的4面体空间内取4个点&#xff0c;有30*29*28*27/2427405种取法&#xff0c;要求得到的4个点必须在直链上。只有144个结构符合要求&#xff0c;在平移操作下不重合的结构有36个。 这36个结构可以按照旋转对称性进一步分成3组0&#xff0c;1&#xff0c;4&#xff0c;每…

Anisble Playbook

文章目录 一、Playbook简介三种常见的数据格式Playbook特点YAML语言介绍 二、Playbook核心组件host组件remote_user组件task列表和action组件gather_factsHandlers notifyignore_errors 三、playbook命令playbook命令tags 标签 四、Playbook中的变量setup模块中的变量Playbook命…

vue3 【提效】自动路由(含自定义路由) unplugin-vue-router 实用教程

不再需要为每一个路由编写冗长的 routes 配置啦&#xff0c;新建文件便可自动生成路由&#xff01; 使用方法 1. 安装 unplugin-vue-router npm i -D unplugin-vue-router2. 修改 vite 配置 vite.config.ts import VueRouter from unplugin-vue-router/viteplugins 中加入 V…

【Redis一】Redis配置与优化

目录 一.关系型数据库与非关系型数据库 1.关系型数据库 2.非关系型数据库 3.二者区别 4.非关系型数据库产生背景 5.NoSQL与SQL数据记录对比 关系型数据库 非关系型数据库 二.Redis相关概述 1.简介 2.五大数据类型 3.优缺点 3.1.优点 3.2.缺点 4.使用场景 5.采用…

苹果应用Testflight上架完整步聚

1.全部选中下图内容,包含iPhone与iPad屏幕所有旋转方向 2. 准备App图标,一定要有152和167这个尺寸,不然后提交不过 3.1024这个尺寸的的图像不能有透明层,不然提交不通过 4.选中编译设备为Any iOS Device[arm64] 5.选择Product下的Archive进行生成 6.在弹出的窗口中选择Test…

Python之三大基本库——Numpy(2)

接着上次的内容接着讲&#xff0c;连续号都续上哈 七、numpu中random的随机生成函数 以下总结的是比较常用到的函数&#xff1a; 下面分别介绍一下不用的用法&#xff1a; 首先导入创建函数 import numpy as np np.random.seed(666)1、 rand(d0,d1,d2,...,dn)&#xff1a;返…

JavaWeb系列三: JavaScript学习 下

文章目录 js数组定义方式数组遍历 js函数函数入门函数使用方式使用方式一使用方式二 函数注意事项函数练习题 定义对象使用object定义使用{}定义 事件onload事件onclick事件失去焦点事件内容发生改变事件表单提交事件静态注册动态注册表单作业 dom对象文档对象模型document对象…