二叉树+树的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…...
用Rust还是JavaScript?Tauri 2.0系统托盘开发的两种姿势与选型建议
Tauri 2.0系统托盘开发:Rust与JavaScript的技术选型深度解析 当桌面应用需要常驻后台运行时,系统托盘功能便成为用户体验的关键组件。Tauri 2.0作为新一代跨平台桌面框架,允许开发者在前端JavaScript与后端Rust两种技术栈中实现这一功能。本文…...
nli-distilroberta-base代码实例:Python调用DistilRoBERTa实现Entailment识别
nli-distilroberta-base代码实例:Python调用DistilRoBERTa实现Entailment识别 1. 项目概述 自然语言推理(Natural Language Inference, NLI)是自然语言处理中的一项重要任务,用于判断两个句子之间的逻辑关系。nli-distilroberta-base是基于DistilRoBER…...
3508RAID卡RAID与JBOD模式对比:如何选择最适合你的存储方案?
3508RAID卡RAID与JBOD模式深度解析:从原理到实战的存储方案选择指南 当企业面临数据存储方案的选择时,3508RAID卡提供的RAID和JBOD模式常常让人陷入纠结。这两种模式看似简单,实则背后隐藏着截然不同的设计哲学和应用场景。本文将带您深入理解…...
终极Chrome全页截图指南:一键保存完整网页内容的高效方案
终极Chrome全页截图指南:一键保存完整网页内容的高效方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-ex…...
Protege新手避坑指南:搞懂‘类’、‘属性’和‘推理’到底怎么用(附常见错误排查)
Protege新手避坑指南:搞懂‘类’、‘属性’和‘推理’到底怎么用(附常见错误排查) 第一次打开Protege时,满屏的术语和复杂的界面可能会让你感到不知所措。作为一款强大的本体编辑工具,Protege确实有着陡峭的学习曲线。…...
保姆级教程:MogFace人脸检测模型-large快速上手,无需代码轻松体验
保姆级教程:MogFace人脸检测模型-large快速上手,无需代码轻松体验 1. 认识MogFace人脸检测模型 1.1 什么是MogFace MogFace是目前最先进的人脸检测方法之一,在Wider Face六项榜单上长期保持领先地位。这个模型通过三个创新点显著提升了检测…...
QGIS 3.28 保姆级配置指南:从中文界面到高德底图,手把手搞定智驾地图工作流
QGIS 3.28 智能驾驶地图工程师开箱指南:从零构建高精度工作流 刚拿到工牌的智能驾驶地图工程师小李,面对全新的QGIS界面有些手足无措。作为空间数据处理的核心工具,QGIS的配置直接决定了后续高精地图生产的效率与精度。本文将带你完成从软件…...
数据清洗避坑指南:缺失值和异常值处理的5个常见错误(附真实案例)
数据清洗避坑指南:缺失值和异常值处理的5个常见错误(附真实案例) 在电商平台的用户行为分析中,我们曾遇到一个诡异现象:某促销活动页面的转化率突然飙升到98%。进一步排查发现,是爬虫程序将未加载完成的页…...
asp毕业设计下载(全套源码+配套论文)——基于asp+sqlserver的WEB社区论坛设计与实现
基于aspsqlserver的WEB社区论坛设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspsqlserver的WEB社区论坛设计与实现,更多精选毕业设计项目下载见文末哦。 文章目录: 基于aspsqlserver的WEB社区论坛设计与…...
Stable-Diffusion-v1-5-archive多分辨率实践:512×512 vs 768×768出图质量与耗时对比
Stable-Diffusion-v1-5-archive多分辨率实践:512512 vs 768768出图质量与耗时对比 你是不是也好奇,用Stable Diffusion出图时,分辨率到底该怎么选?是选经典的512512,还是追求更高清的768768?选高了怕电脑跑…...
