二叉树+树的OJ题讲解
求第K层节点个数
思路:走到K==1就不走了,一次传回得到的值
#include<stdio.h>
#include<stdlib.h>
//树的定义
typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;//手搓一棵树 malloc
BTNode* BuyNode(int x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){perror("malloc fail");return;}node->data = x;node->left = node->right = NULL;
}BTNode* CreatBinaryTree()
{BTNode* node1 = BuyNode(1);BTNode* node2 = BuyNode(2);BTNode* node3 = BuyNode(3);BTNode* node4 = BuyNode(4);BTNode* node5 = BuyNode(5);BTNode* node6 = BuyNode(6);//怎么指向根据树写出来node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return node1;
}//求第K层节点个数
int TreeLevelSize(BTNode* root, int k)
{if (root == NULL)return NULL;if (k == 1)return 1;//到K==1层就返回程序return TreeLevelSize(root->left, k - 1) + TreeLevelSize(root->right, k - 1);//其实一遍一遍的递归也算是--K了
}
int main()
{BTNode* root = CreatBinaryTree();printf("%d", TreeLevelSize(root,3));return 0;
}
二叉树查找值为X的节点
根据提示自己写的
BTNode* TreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;//该函数有返回值类型,是空也要返回空,不能直接写逗号if (root->data == x)return root;BTNode* ret1 = TreeFind(root->left, x);BTNode* ret2 = TreeFind(root->right, x);if (root->left == x)return ret1;if (root->right == x)return ret2;return NULL;//根左右都没有,返回空
}
int main()
{BTNode* root = CreatBinaryTree();TreeFind(root,4);return 0;
}
根本运行不出来
BTNode* TreeFind(BTNode* root, BTDataType x)
{if (root->data == x)return root;BTNode* ret1 =NULL;BTNode* ret2 = NULL;if (root->left == x){ret1 = root->left;return ret1;}if (root->right == x){ret2 = root->right;return ret2;}return NULL;//这样应该每个情况都有返回值
}int main()
{BTNode* root = CreatBinaryTree();TreeFind(root,4);return 0;
}
第二种也是错的

判断条件值的类型是不对应的
查找的正确写法
BTNode* TreeFind(BTNode* root, BTDataType x)
{/*首先每一种状态必须要有返回值必须要有变量接收递归的值判断条件只要ret1 ret2不为空那就说明有与x相等的,直接判断ret就行就不会涉及root->left与x比较,而是root->data与x比较*/if (root == NULL)return NULL;if (root->data == x)return root;BTNode* ret1 = TreeFind(root->left, x);BTNode* ret2 = TreeFind(root->right, x);if (ret1)return ret1;//左子树有就不用再看右子树了,直接返回if (ret2)return ret2;return NULL;//左右都没有
}
leetcode 100.相同的树(简单)

思路:根和根比较,左子树和左子树比,右子树和右子树比
比较相同,一个相同没用,必须全部相同,返回什么?太难写了
反过来写:把所有的不相等的情况写出来返回false 走到光标闪动的位置就是全都相等
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p==NULL&&q==NULL)return true;if(p==NULL||q==NULL)return false;//他俩都有值//先比根吧,在递归左子树右子树if(p->val!=q->val)return false;return isSameTree(p->left,q->left)&& isSameTree(p->right,q->right);//都不返回错误//那就是相同的树了return true;
}
nice哦,逻辑能梳理清楚了
leetcode 101. 对称二叉树(和第一题类似)

思路:根和根比,左子树和右子树比,右子树和左子树比
错误写法:
bool _isSymmetric(struct TreeNode*left, struct TreeNode*right)
{//用来判断不等吧,相等返回值不好写if(left==NULL&&right==NULL)return true;if(left==NULL||right==NULL)return false;//都有值了,判断值if(left!=right)return false;return _isSymmetric(left,right)&& _isSymmetric(right,left);//左右 右左都要比return true;
}
bool isSymmetric(struct TreeNode* root)
{return _isSymmetric(root->left,root->right);}

这个测试用例过不了

是因为我只是传了左右节点而不是左右子树
到了节点2,我比较的是3,4 而不是3 和 3 还是要传根节点的左右子树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
//再写一个函数 一般在前面+横杠
bool _isSymmetric(struct TreeNode*p, struct TreeNode*q)
{//用来判断不等吧,相等返回值不好写if(p==NULL&&q==NULL)return true;if(p==NULL||q==NULL)return false;if(p->val!=q->val)return false;return _isSymmetric(p->left,q->right)&&_isSymmetric(p->right,q->left);return true;/*if(p->right==NULL||q->left==NULL)return false;//都有值了,判断值if(p->left!=q->right||p->right!=q->left)return false;return _isSymmetric(p->left,q->right)&& _isSymmetric(p->right,q->left);//左右 右左都要比return true;*/
//}
bool isSymmetric(struct TreeNode* root)
{return _isSymmetric(root->left,root->right);}
思路得清晰,判断完值之后后面就是重复的判断子树,直接递归了,不要做多余的判断,后面的操作相同
144.二叉树的前序遍历并存到数组里(数组自己malloc出来)
我们该扩容多大的数组?—>把树遍历一遍求个数

int TreeSize(struct TreeNode*root){return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;//左子树节点个数+右子树节点个数+根}void preorder(struct TreeNode*root,int*a,int *pi){if(root==NULL)return;a[(*pi)++]=root->val;preorder(root->left,a,pi);preorder(root->right,a,pi);}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize=TreeSize(root);int*a=(int*)malloc(sizeof(int)*(*returnSize));int i=0;preorder(root,a,&i);return a;
}
其中returnsize是第一次接触的输出型参数
力扣中要返回数组就是要返回数组大小
为什么不传i而是传指针pi
因为i在形参是局部变量是并没有因为递归而累加(实际改变的)所以要改成传址调用
相关文章:
二叉树+树的OJ题讲解
求第K层节点个数 思路:走到K1就不走了,一次传回得到的值 #include<stdio.h> #include<stdlib.h> //树的定义 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode;//手…...
信捷PLC转以太网连接电脑方法
信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程,即插即用,具体看见以下介绍: 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计,可实现工厂设备信息化需求,对…...
释放 PWA 的力量:2024 年的现代Web应用|React + TypeScript 示例
在2024年的Web开发领域,PWA(Progressive Web Apps)已经成为一个不可忽视的技术趋势。这篇文章将探讨PWA的最新发展,并通过实例展示如何构建一个现代PWA应用。 PWA的本质与优势 PWA本质上是一种将Web应用提升到接近原生应用体验的技…...
CVSS4与CVSS3的不同之二
在文章CVSS4与CVSS3的不同-CSDN博客中描述了CVSS3的缺点,以及CVSS4相对CVSS3做了哪些改进和带来了哪些优点。 但是具体CVSS4针对CVSS3做了哪些改动,还没有详细列举出来。 本文主要是针对CVSS4和CVSS的打分的大项和小项进行逐一对比,列出来具体…...
【Pip】如何清理 `pip` 包管理器 —— 完整指南
目录 引言1. 清理 pip 缓存2. 卸载不再需要的包2.1 如何查看已安装的包2.2 如何卸载不需要的包 3. 查看已安装的包及其依赖3.1 查看单个包的依赖3.2 查看所有包的依赖关系3.2 优化包依赖 4. 解决包冲突5. 合并和优化依赖5.1 优化 requirements.txt5.2 删除冗余依赖 6. pip 清理…...
操作数据库
""" 本文件是【连接数据库:通过链和代理查询鲜花信息】章节的配套代码,课程链接:https://juejin.cn/book/7387702347436130304/section/7388065974408183858 您可以点击最上方的“运行“按钮,直接运行该文件&…...
lua-lru缓存算法解析
lua-lru缓存算法解析 主要功能和作用1. 缓存管理:2. 数据存储与访问:3. 迭代器:4. 容量管理: 具体实现细节使用场景使用示例 lua-lru 是 Lua 语言中的一个 LRU(Least Recently Used,最近最少使用࿰…...
Python - 初识Python;Python解释器下载安装;Python IDE(一)
一、初识Python Python 是一种高级编程语言,Python是一种面向对象的解释型计算机程序设计语言,Python由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆()Guido van Rossum吉多范罗苏姆()于1989 年底发明…...
鸿蒙学习基本概念
文章目录 1、当前移动应用开发中遇到的主要挑战包括:2、 新的应用生态应该具备如下特征:3、HarmonyOS 应用:使用 HarmonyOS SDK 开发的应用程序,能够在华为终端设备4、HarmonyOS 元服务:元服务是 HarmonyOS 面向万物互…...
正则表达式(补充)
定义一个正则表达式 const 变量名 /表达式/ const reg /前端/ 匹配看字符串中有无前端俩字 正则对象上的一些方法 test() 用于查看正则表达式与指定的字符串是否匹配 const reg /前端/ const res reg.test(学前端,找黑马) //匹配到返回true,匹配不到返回fa…...
第23课-C++-红黑树的插入与旋转
🌇前言 红黑树是一种自平衡的二叉搜索树,因其出色的性能,广泛应用于实际中。Linux 内核中的 CFS 调度器便是一个使用红黑树的例子,这足以说明它的重要性。红黑树的实现通过红黑两种颜色的控制来维持平衡,并在必要时使…...
【C#】C#编程入门指南:构建你的.NET开发基础
文章目录 前言:1. C# 开发环境 VS的基本熟悉2. 解决方案与项目的关系3. 编辑、编译、链接、运行4. 托管代码和CLR4.1 CLR:4.2 C# 代码第编译过程(两次编译的) 5. 命名空间6. 类的组成与分析7. C# 的数据类型7.1 值类型7.2 引用类型…...
[系统安全] PE文件知识在免杀中的应用
0x1 PE文件与免杀思路 基于PE文件结构知识的免杀技术主要用于对抗启发式扫描。 通过修改PE文件中的一些关键点来达到欺骗反病毒软件的目的。 修改区段名 1.1 移动PE文件头位置免杀 工具:PeClean SizeOfOptionalHeader字段来描述扩展头的大小,恒定值为…...
相机标定原理
相机标定原理 什么是相机标定相机畸变 什么是相机标定 为了确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,需建立相机成像的几何模型,几何模型参数即为相机参数,求解相机参数的过程就是相机标定。 坐标系 **世界坐标…...
Linux基础开发工具使用
目录 1. 软件包管理器yum 1.1 概念介绍 1.2 更换镜像源(可选) 1.3 工具的搜索/查看/安装/卸载 1.4 优势 2. vim编辑器 2.1 vi和vim 2.2 三种常用模式和操作 2.3 配置vim 3. Linux编译器-gcc/g 4. Linux调试器-gdb 5. make和Makefile 6.…...
蓝牙PBAP协议及Android实现
文章目录 前言一、什么是PBAP协议?PBAP的关键功能 二、PBAP的工作流程PBAP流程 三、PBAP在Android实现关键步骤:1. 检查设备是否支持 PBAP 服务 2. 创建 PBAP 连接3. 发送 OBEX 请求4. 解析 vCard 数据数据存储与展示6. 性能优化建议7. 完整示例…...
Py之pymupdf:基于langchain框架结合pymupdf库实现输出每个PDF页面的文本内容、元数据等
Py之pymupdf:基于langchain框架结合pymupdf库实现输出每个PDF页面的文本内容、元数据等 目录 PyMuPDFLoader类 初始化 属性 方法 __init__(file_path, *, headers=None, extract_images=False, **kwargs) lazy_load() aload() alazy_load() load(**kwargs) load_and…...
LeetCode题解:17.电话号码的数字组合【Python题解超详细,回溯法、多叉树】,知识拓展:深度优先搜索与广度优先搜索
题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出…...
《JVM第10课》内存溢出(OOM)排查过程
文章目录 常用命令1. jps2. jconsole3. jstat4. jmap 工具1.jvisualvm 排查OOM的方法其实很简单很简单。 如果能找到拋OOM的日志,可以在日志里看到是哪一行抛出的OOM异常。如果找不到日志,那么处理方式是导出Java进程的内存快照,然后用工具查…...
Thinkphp6视图介绍
一.MVC MVC 软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller) ThinkPHP6 是一个典型的 MVC 架构 控制器—控制器,用于将用户请求转发给相应的Model进行处理&a…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
