二叉树OJ题目——C语言

LeetCode 104.二叉树的最大深度

1. 题目描述:

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

OJ题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2. 整体思路:

首先要判断根是否存在,如果根存在,继续向下遍历,再次遍历的时候,先判断其左右子树是否存在,若存在,再遍历其左右子树,此时就不用再进行根判断了,根判断的代码只在进入函数时有效执行。 

以下是我们的大致思路,但是递归的图着实太难画了,实在不理解可以仔细参照文字或者自己画 

在画图的过程中我们也发现了,我们每次都要返回左右子树遍历后的较大值,如何做?
这时我们可以借用C语言库中的较大值函数,而且可以进行代码的简化:

3.解题代码: 

int maxDepth(struct TreeNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return fmax(maxDepth(root->left), maxDepth(root->right)) + 1;
}

LeetCode 100.相同的树 

1.题目描述:

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

输入:p = [1,2,1], q = [1,1,2]
输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • -104 <= Node.val <= 104

OJ题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2.整体思路:

我们先比较根,然后比较左子树,再比较右子树。
比较根时,我们要注意根的情况,如果两根都为空,或者某一根为空
当过筛后,我们才能进行递归。

3.解题代码:

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);
 }

LeetCode 965.单值二叉树

1.题目描述:

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false

示例 1:

输入:[1,1,1,1,1,null,1]
输出:true

示例 2:

输入:[2,2,2,5,2]
输出:false

提示:

  1. 给定树的节点数范围是 [1, 100]
  2. 每个节点的值都是整数,范围为 [0, 99] 。

OJ题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2.整体思路:

我们可以考虑如何使用递归来解题,首先要考虑的肯定是父子结点的关系,我们把每棵树都分为根、左结点、右结点,在刚开始比较三者的值,若相等就继续向下递归。然后我们根据思路还加以改进判断了根的左右结点是否存在后,写了以下代码:

我们运行时测试用例正确,但提交时却报错:

 原来是我们加以判断的左右子树是否存在的条件忽略了只存在一个结点且与根不一样的情况:

我们改进了代码,现在只有当子结点存在且与根结点的值相等时才会进行递归。

3.解题代码:

 bool isUnivalTree(struct TreeNode* root)
 {
	 if (root == NULL)
		 return true;
	 if (root->left && root->left->val != root->val)
		 return false;
	 if (root->right && root->right->val != root->val)
		 return false;
	 bool leftans = isUnivalTree(root->left);
	 bool rightans = isUnivalTree(root->right);
	 return leftans && rightans;
 }

LeetCode 144.二叉树的前序遍历

1.题目描述:

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]
输出:[1,2]

示例 5:

输入:root = [1,null,2]
输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

2.整体思路:

我们先来看他代码区的代码,其实还是能发现一点端倪的,这和我们之前写的前序遍历大不相同,这道OJ题需要一个返回值,他要求我们放到数组里面。
然而数组应该开多大呢?returnSize其实并非是题者给我们的提示,所以我们需要遍历二叉树自己找到二叉树的结点个数,这就用到了二叉树中求结点个数的函数:

然后我们看到returnSize,我们先来解释一下啊returnSize的意思:它并不是题者给我们的提示,在LeetCode中,当需要我们malloc来返回数组时,通常参数都会给我们配returnSize,在我们的代码中我们需要修改returnSize的值,以此让OJ后台能遍历我们的数组。

我们来写一个把值存放入数组的前序遍历函数,其实和前序遍历的区别就是不打印而存入数组。

最后,在我们的主函数中,我们只需要调用上述函数并将存入数组的下标传入即可:

3.解题代码:

int TreeSize(struct TreeNode* root)
{
    if(root == NULL)
        return 0;
    return TreeSize(root->left) + TreeSize(root->right) + 1;
}
void Preorder(struct TreeNode* root, int* a, int* p)
{
    if(root == NULL)
        return;
    a[*p] = root->val;
    (*p)++;
    Preorder(root->left, a, p);
    Preorder(root->right, a, p);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{
    int size = TreeSize(root);
    int* a = (int*)malloc(sizeof(int) * size);
    *returnSize = size;

    int i = 0;
    Preorder(root, a, &i);
    return a;
}

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

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

相关文章

Docker数据卷

创建数据卷html、conf &#xff0c;分别与Nginx容器内部的html、conf目录关联。数据卷html、conf分别指向宿主机 /var/lib/docker/volumes/html/_data 目录和 /var/lib/docker/volumes/conf/_data 目录&#xff0c;将容器中的html、conf目录与宿主机的html、conf目录关联起来&a…

Leetcode—1657.确定两个字符串是否接近【中等】

2023每日刷题&#xff08;四十五&#xff09; Leetcode—1657.确定两个字符串是否接近 算法思想 源于灵神 实现代码 class Solution { public:bool closeStrings(string word1, string word2) {int len1 word1.size();int len2 word2.size();if(len1 ! len2) {return fa…

【代码】基于储能电站服务的冷热电多微网系统双层优化配置(完美复现)matlab/yalmip

程序名称&#xff1a;基于储能电站服务的冷热电多微网系统双层优化配置 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;代码主要做的是一个共享储能电站的双层优化配置模型&#xff0c;将储能电站服务应用到多维网系统中&#xff0c;建立了考虑不同时…

23.Python 图形化界面编程

目录 1.认识GUI和使用tkinter2.使用组件2.1 标签2.2 按钮2.3 文本框2.4 单选按钮和复选按钮2.5 菜单和消息2.6 列表框2.7 滚动条2.8 框架2.9 画布 3. 组件布局4.事件处理 1.认识GUI和使用tkinter 人机交互是从人努力适应计算机&#xff0c;到计算机不断适应人的发展过程&#…

Linux操作系统 2.Linux基础命令

Linux基础命令&#xff0c;掌握这一套清晰的讲解就够啦&#xff01; 本篇博客给大家带来的是Linux的基础命令和vi编辑器 感谢大家收看~ 一、Linux目录结构 Linux的目录结构是一个树形结构&#xff0c;Linux只有一个根目录 / 所有文件都存在/下面 Linux路径的描述方式 Linux系…

12.2_黑马Redis实战篇附近商铺用户签到UV统计

实战篇11 实战篇12 要先用test的方式把商铺的数据导入到idea当中&#xff0c;才可以进行查询噢。 代码&#xff1a; 实战篇13 thinking&#xff1a;插件mavenhelper&#xff1f; 方便处理pom文件。 实战篇15 实战篇16 thinking&#xff1a;XX.format(DateTimeFormatter.ofP…

6.8 Windows驱动开发:内核枚举Registry注册表回调

在笔者上一篇文章《内核枚举LoadImage映像回调》中LyShark教大家实现了枚举系统回调中的LoadImage通知消息&#xff0c;本章将实现对Registry注册表通知消息的枚举&#xff0c;与LoadImage消息不同Registry消息不需要解密只要找到CallbackListHead消息回调链表头并解析为_CM_NO…

23种设计模式之C++实践(一)

23种设计模式之C++实践 1. 简介2. 基础知识3. 设计模式(一)创建型模式1. 单例模式——确保对象的唯一性1.2 饿汉式单例模式1.3 懒汉式单例模式比较IoDH单例模式总结2. 简单工厂模式——集中式工厂的实现简单工厂模式总结3. 工厂方法模式——多态工厂的实现工厂方法模式总结4.…

TOP-K问题和向上调整算法和向下调整算法的时间复杂度问题的分析

TOP-K问题 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 对于Top-K问题&#xff0c;能想到的最简单直接的方式就是排序&#xff0c;但是…

LD_PRELOAD劫持、ngixn临时文件、无需临时文件rce

LD_PRELOAD劫持 <1> LD_PRELOAD简介 LD_PRELOAD 是linux下的一个环境变量。用于动态链接库的加载&#xff0c;在动态链接库的过程中他的优先级是最高的。类似于 .user.ini 中的 auto_prepend_file&#xff0c;那么我们就可以在自己定义的动态链接库中装入恶意函数。 也…

maven下载和安装

maven下载和安装 一、概述 Maven是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来…

算法通关村第十四关-白银挑战堆的经典问题

大家好我是苏麟 , 今天带来堆的一些经典问题 , 我们一起研究一下 . 大纲 数组中的第K个最大元素合并 K 个升序链表 数组中的第K个最大元素 描述 : 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k …

Hdoop学习笔记(HDP)-Part.14 安装YARN+MR

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Java Throwable

如图展示了 Java 整个异常体系的关系。 Throwable 的 Java 异常体系的基类, 他的直接子类有 Error 和 Exception 2 个。 1 Error Error 表示的是由于系统错误, Java 虚拟机抛出的异常, 例如 Java 虚拟机崩溃, 内存不够等, 这种情况仅凭程序自身是无法处理的, 在程序中也不会…

VBA_MF系列技术资料1-232

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

Aspice(Automotive Software Process Improvement and Capability Determination)

Aspice&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09; 1. 引言&#xff1a;ASPICE概述 定义 ASPICE简介&#xff1a;ASPICE&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09;…

使用coco数据集进行语义分割(1):数据预处理,制作ground truth

如何coco数据集进行目标检测的介绍已经有很多了&#xff0c;但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json&#xff0c;将上面那些json中的dict转化为图片的label mask&am…

前几天面了个30岁的测试员,年薪50w问题基本都能回答上,应该刷了不少八股文···

互联网行业竞争是一年比一年严峻&#xff0c;作为测试工程师的我们唯有不停地学习&#xff0c;不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水&#xff0c;进入心仪的企业&#xff08;阿里、字节、美团、腾讯等大厂.....&#xff09; 所以&#xff0c;大家就迎来了…

【每日一题】拼车+【差分数组】

文章目录 Tag题目来源解题思路方法一&#xff1a;差分 写在最后 Tag 【差分数组】【数组】【2023-12-02】 题目来源 1094. 拼车 解题思路 本题朴素的解题思路是统计题目中提到的每一个站点的车上人数&#xff0c;如果某个站点的车上人数大于车上的座位数直接返回 false&…

1688API接口系列,1688开放平台接口使用方案(商品详情数据+搜索商品列表+商家订单类)

1688商品详情接口是指1688平台提供的API接口&#xff0c;用于获取商品详情信息。通过该接口&#xff0c;您可以获取到商品的详细信息&#xff0c;包括商品标题、价格、库存、描述、图片等。 要使用1688商品详情接口&#xff0c;您需要先申请1688的API权限&#xff0c;并获取ac…