LeetCode/NowCoder-二叉树OJ练习

news2024/9/23 23:57:55

励志冰檗:形容在清苦的生活环境中激励自己的意志。💓💓💓

目录

 说在前面

题目一:单值二叉树

题目二:相同的树

题目三:对称二叉树

题目四:二叉树的前序遍历

题目五:另一棵树的子树

题目六:二叉树的构建及遍历

SUMUP结尾


 说在前面

 dear朋友们大家好!💖💖💖我们又见面了,又到了我们数据结构的刷题时间了。我们上次刚学完了二叉树的知识,现在就让我们来练练手~

 👇👇👇

友友们!🎉🎉🎉点击这里进入力扣leetcode学习🎉🎉🎉


​以下是leetcode题库界面:

​​

 👇👇👇

🎉🎉🎉点击这里进入牛客网NowCoder刷题学习🎉🎉🎉
​以下是NowCoder题库界面:

 

题目一:单值二叉树

题目链接:965. 单值二叉树 - 力扣(LeetCode)

题目描述:

题目分析:

思路:对于二叉树的OJ练习我们一定要多利用递归的思想,即将大问题拆成子问题。首先我们考虑,如果树为空,显然也是单值二叉树,返回true;如果节点中的值与它左右子树根节点的值不同,那肯定返回false;如果和它左右子树根节点的值都相同,就递归到左右子树,按照同样的逻辑即可。

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isUnivalTree(struct TreeNode* root) {
    if(root == NULL)
        return true;
    if(root->left && root->val != root->left->val || root->right && root->val != root->right->val)
        return false;
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

 

题目二:相同的树

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

题目描述:

题目分析:

思路:首先,我们需要判断这两棵树是否为空,如果都为空,那么也是相同的树,如果其中有一个为空,另一个不为空,那就不是相同的树;如果第一棵树和第二棵树的值不相等,那肯定不是相同的树;如果它们的值相等,就需要递归到左右子树,如果左右子树都满足,自然最终会回到第一种情况,再将true回归。

 代码如下:

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

 

题目三:对称二叉树

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

题目描述:

题目分析:

思路:这道题的思路和题目二有些许类似,题目二是判断两棵树的左右子树是否相同,而这道题是判断你的左子树和我的右子树是否相同即可,也就是我们把二叉树分为root->left和root->right,利用和题目二相同的逻辑就可以了。

代码如下:

/**
 * 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 && !q)
        return true;
    if(!p || !q)
        return false;
    return p->val != q->val ? false : 
            _isSymmetric(p->left, q->right) && _isSymmetric(p->right, q->left); 
}

bool isSymmetric(struct TreeNode* root) {
    return _isSymmetric(root->left, root->right);
}

 

题目四:二叉树的前序遍历

题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)

题目描述:

题目分析:

思路:我们再上一章二叉树的部分学习过二叉树的前序遍历,但我们之前的前序遍历在遍历过程中的操作是打印节点的值,我们现在的操作是把它存在一个数组arr中。那数组的大小*returnSize是多少呢?显然就是树的节点,所以我们也需要TreeSize函数来计算树的节点。

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

typedef struct TreeNode TreeNode;

//树的节点个数
int TreeSize(TreeNode* root)
{
    if(root == NULL)
        return 0;
    return TreeSize(root->left) + TreeSize(root->right) + 1;
}

//前序遍历
void PrevOrder(TreeNode* root, int* arr, int* pi)
{
    if(root == NULL)
        return;
    arr[(*pi)++] = root->val;
    PrevOrder(root->left, arr, pi);
    PrevOrder(root->right, arr, pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);
    int* arr = (int*)malloc((*returnSize) * sizeof(int));
    int i = 0;
    PrevOrder(root, arr, &i);
    return arr;
}

注意:i作为数组arr的下标,会随着递归的深度而进行改变,所以需要传址调用。

 

题目五:另一棵树的子树

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

题目描述:

题目分析:

思路:这道题我们首先判断root本身是否为空,如果本身为空,显然subRoot不可能是root的子树。如果root不为空,我们判断root和subRoot是否是相同的树(相同的树也算true),如果是就返回true,如果不是,就递归到它的左右子树即可。所以我们还需要用到题目二中的相关代码。

代码如下:

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

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root == NULL)
        return false;
    return isSameTree(root, subRoot) ? true :
        isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}

 

题目六:二叉树的构建及遍历

题目链接:二叉树遍历_牛客题霸_牛客网 (nowcoder.com)

题目描述:

题目分析:

思路:这道题依旧用到了我们上一章中前序和中序遍历的思想,首先构建二叉树我们需要将前序遍历存放在数组arr中,用i作为下标。和题目五类似,i也需要传地址调用。

代码如下:

#include <stdio.h>
#include <stdlib.h>
 
#define MAXSIZE 100
 
typedef char BTDataType;
 
typedef struct BinaryTreeNode
{
    BTDataType data;
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
}BTNode;
 
//二叉树的构建
BTNode* CreateTree(char* arr, int* pi)
{
    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    if(arr[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    root->data = arr[(*pi)++];
    root->left = CreateTree(arr, pi);
    root->right = CreateTree(arr, pi);
    return root;
}
 
//中序遍历
void InOrder(BTNode* root)
{
    if(root == NULL)
        return;
    InOrder(root->left);
    printf("%c ", root->data);
    InOrder(root->right);
}
 
int main()
{
    char arr[MAXSIZE];
    scanf("%s",arr);
    int i = 0;
    BTNode* root = CreateTree(arr, &i);
    InOrder(root);
 
    return 0;
}

 

SUMUP结尾

数据结构就像数学题,需要刷题才能对它有感觉。之后还会更新数据结构相关的练习题、面试题,希望大家一起学习,共同进步~

如果大家觉得有帮助,麻烦大家点点赞,如果有错误的地方也欢迎大家指出~

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

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

相关文章

Python | Leetcode Python题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution:def hIndex(self, citations: List[int]) -> int:n len(citations)left 0; right n - 1while left < right:mid left (right - left) // 2if citations[mid] > n - mid:right mid - 1else:left mid 1retur…

C语言之2048小游戏理解分析

目录 游戏程序思维导图&#xff1a; ​编辑 功能介绍&#xff1a; 代码管理&#xff1a; 主函数&#xff1a; 头文件&#xff1a; 游戏程序思维导图&#xff1a; 功能介绍&#xff1a; 按键W --------------- 向上 按键A --------------- 向左 按键S --------------- 向…

科技云报道:算网筑基AI注智,中国联通如何讲出AI时代的“新故事”?

科技云报道原创。 AI从未停止进化&#xff0c;也从未停止给人类带来惊喜。 从ChatGPT代表的文生文、Dall-E代表的文生图&#xff0c;到Sora代表的文生视频&#xff0c;Suno为代表的文生音乐&#xff0c;生成式AI的“暴力美学”持续突破内容生产的天花板&#xff0c;大模型技术…

【黑马java基础】特殊文件,日志

目录 特殊文件&#xff1a;Properties属性文件特点、作用使用Properties读取属性文件里的键值对数据使用properties把键值对数据写到属性文件中去案例 特殊文件&#xff1a;XML文件概述读取XML文件中的数据把数据写出到XML文件中去补充知识&#xff1a;约束XML文件的编写[了解]…

打卡第21天------二叉树

我现在每天都是在与时间赛跑&#xff0c;分秒必争&#xff0c;不想浪费一点我自己的时间。 希望通过算法训练营可以把我自己的逻辑思维建立起来&#xff0c;把自己的算法能力给提上去。 一、修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 题目描述&#xff1a; 给…

最优化原理(笔记)

内积是线性代数运算的一个结果&#xff0c;一行*一列。 内积的性质&#xff01; 什么是范数&#xff1f;&#xff1f;&#xff1f; 对称矩阵&#xff1a;关于主对角线对称&#xff01; 正定对称矩阵&#xff1a; 二阶导是正定的&#xff0c;f(x)就是严格的凸函数&#xff01;&a…

element的el-autocomplete带输入建议搜索+搜索匹配文字高亮显示

element的el-autocomplete带输入建议搜索搜索匹配文字高亮显示 直接上代码 // vue代码块 添加插槽<el-autocompleteclearableplaceholder"请输入关键词进行搜索"input"searchInput"v-model"searchInputData":fetch-suggestions"queryS…

Android APP 音视频(02)MediaProjection录屏与MediaCodec编码

说明&#xff1a; 此MediaProjection 录屏和编码实操主要针对Android12.0系统。通过MediaProjection获取屏幕数据&#xff0c;将数据通过mediacodec编码输出H264码流&#xff08;使用ffmpeg播放&#xff09;&#xff0c;存储到sd卡上。 1 MediaProjection录屏与编码简介 这里…

【测开能力提升-Javascript】JavaScript运算符流程结构

1. 递增递减运算符 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script>// 前置递增运算符var age10age //类似于ageage1&#xff0c; 先加1后返回值alert(age)// 后置…

【数据结构 | 哈希表】一文了解哈希表(散列表)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【SQL语句大全(MySQL)】

SQL语法 添加删除修改查询基本查询条件查询分组函数/聚合函数分组查询排序分页查询&#xff08;限制查询&#xff09;多表查询连接查询根据年代分类连接查询根据连接方式分类1、内连接2、左外连接3、右外连接 多张表连接的语法格式 嵌套查询 SQL语句书写顺序 添加 INSERT INTO…

什么是STP环路保护

在运行生成树协议的网络中&#xff0c;根端口和其他阻塞端口状态是依靠不断接收来自上游设备的BPDU维持。当由于链路拥塞或者单向链路故障导致这些端口收不到来自上游交换设备的BPDU时&#xff0c;设备会重新选择根端口。原先的根端口会转变为指定端口&#xff0c;而原先的阻塞…

2019年9月全国英语等级考试第三级笔试真题

2019年9月全国英语等级考试第三级笔试真题

vue3.0学习笔记(三)——计算属性、监听器、ref属性、组件通信

1. computed 函数 定义计算属性&#xff1a; computed 函数&#xff0c;是用来定义计算属性的&#xff0c;计算属性不能修改。 计算属性应该是只读的&#xff0c;特殊情况可以配置 get set 核心步骤&#xff1a; 导入 computed 函数 执行函数 在回调参数中 return 基于响应…

尚品汇-sku存入Redis缓存(二十三)

目录&#xff1a; &#xff08;1&#xff09;分布式锁改造获取sku信息 &#xff08;2&#xff09;使用Redisson 分布式锁 AOP实现缓存 &#xff08;3&#xff09;定义缓存aop注解 &#xff08;1&#xff09;分布式锁改造获取sku信息 前面学习了本地锁的弊端&#xff0c;…

Springboot validated JSR303校验

1.导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 2.测试类 package com.jmj.gulimall.product.testC;import lombok.Data;import javax.val…

《0基础》学习Python——第二十讲__网络爬虫/<3>

一、用post请求爬取网页 同样与上一节课的get强求的内容差不多&#xff0c;即将requests.get(url,headershead)代码更换成requests.post(url,headershead),其余的即打印获取的内容&#xff0c;如果content-typejson类型的&#xff0c;打印上述代码的请求&#xff0c;则用一个命…

argon主题调整日记

前言 argon主题是一款由solstice23开发的一款简洁美观的WordPress主题&#xff0c;在使用过程中也发现了几个可以优化的点&#xff0c;在查阅主题文档无果后对其进行以下几点修改。 1、使用子主题 为了避免修改源文件而引起主题更新后修改丢失的问题&#xff0c;还是尽量使用子…

一个C++模板工厂的编译问题的解决。针对第三方库的构造函数以及追加了的对象构造函数。牵扯到重载、特化等

一窥模板的替换和匹配方式&#xff1a;偏特化的参数比泛化版本的还要多&#xff1a;判断是不是std::pair&#xff1c;,&#xff1e;。_stdpair模板参数太多-CSDN博客 简介 在一个项目里&#xff0c;调用了第三封的库&#xff0c;这个库里面有个类用的很多&#xff0c;而且其构…

Mindspore框架循环神经网络RNN模型实现情感分类|(六)模型加载和推理(情感分类模型资源下载)

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…