【LeetCode】链式二叉树OJ题---C语言版

news2024/12/26 21:49:11

链式二叉树OJ题

  • 一、单值二叉树
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:
  • 二、二叉树最大深度
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:
  • 三、检查两颗树是否相同
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:
  • 四、二叉树的前序遍历
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:
  • 五、翻转二叉树
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:
  • 六、另一颗树的子树
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:
  • 七、二叉树的构建及遍历
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:

一、单值二叉树

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

  1. 如果传回来是空节点,那么就返回真。
  2. 如果传过来只有一个节点,那么我们也返回真
  3. 首先我们应该先判断不相等的,因为相等的他肯定要递归嘛(最值得注意的是你得先判断这个左/右子树,它存在不存在!只有左/右子树存在了,才能判断左/右子树中的值跟它的根节点是否相等。如果左子树不存在,我们都不需要判断它!如果左子树不存在,我们就直接访问空了,这样会报错的。)
  4. 如果以上的三种情况都不符合的话,我们就继续递归往下走。

(3)代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isUnivalTree(struct TreeNode* root) 
{
    //1.如果传回来是空节点,那么就返回真。
   if(root==NULL)
   {
       return true;
   }
   //2.如果传过来只有一个节点,那么我们也返回真
   if(root->left==NULL&&root->right==NULL)
   {
       return true;
   }
   //3.首先我们应该先判断不相等的,因为相等的他肯定要递归嘛
   //最值得注意的是,你得先判断这个左/右子树,它存在不存在!只有左/右子树存在了,才能判断左/右子树中的值跟它的根节点是否相等。如果左子树不存在,我们都不需要判断它!如果左子树不存在,我们就直接访问空了,这样会报错的。
   if(root->left&&root->left->val!=root->val)
   {
       return false;
   }
   else if(root->right&&root->right->val!=root->val)
   {
       return false;
   }

    //4.如果以上的三种情况都不符合的话,我们就继续递归往下走。
   return isUnivalTree(root->left)&&isUnivalTree(root->right);

}

二、二叉树最大深度

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

从根开始分别遍历左子树和右子树,取最大的就是整个树的最大深度

递归展开图理解
在这里插入图片描述

(3)代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int maxDepth(struct TreeNode* root) 
{
    if(root==NULL)
    {
        return 0;
    }

    return fmax(maxDepth(root->left),maxDepth(root->right))+1;
}

三、检查两颗树是否相同

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

1.如果两个二叉树都为空,则两个二叉树相同。
2.如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。

3.如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。

(3)代码实现:

/**
 * 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)//if((p==NULL&&q!=NULL)||(p!=NULL&&q==NULL))
    {
        return false;
    }
    //两个都不为空
    //1.先判断不相等
    if(p->val!=q->val)
    {
        return false;
    }
    //2.如果相等
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);

}

四、二叉树的前序遍历

(1)题目描述:

点击链接

在这里插入图片描述

(2)思路表述:

  1. 创建一个刚好满足所有储存树的结点的数组空间大小
  2. 以前序的方式把树中的结点依次放入数组中

(3)代码实现:

/**
 * 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().
 */

int TreeSize(struct TreeNode* root)
{
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}


void Prevorder(struct TreeNode* root,int* arr,int* i)
{
    if(root==NULL)
    {
        return;
    }
    arr[(*i)++]=root->val;
    Prevorder(root->left,arr,i);
    Prevorder(root->right,arr,i);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{
    //1.创建一个刚好满足所有储存树的结点的数组空间大小
    int n=TreeSize(root);
    int* arr=(int*)malloc(sizeof(int)*n);

    int i=0;

    //2.以前序的方式把树中的结点依次放入数组中
    Prevorder(root,arr,&i);

    *returnSize=n;
    return arr;
}

五、翻转二叉树

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

  1. 我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转
  2. 一直遍历到树的的叶子节点
  3. 如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root 为根节点的整棵子树的翻转。

不理解的时候:就画递归展开图就行

(3)代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

 //不理解的时候:就画递归展开图就行!
struct TreeNode* invertTree(struct TreeNode* root) 
{
    if(root==NULL)
    {
        return NULL;
    }
    //我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转
    struct TreeNode* left=invertTree(root->left);//一直遍历到树的的叶子节点
    struct TreeNode* right=invertTree(root->right);

    root->left=right;
    root->right=left;


//如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root 为根节点的整棵子树的翻转。

    return root;
   
}

六、另一颗树的子树

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

  1. 如果root为NULL,我们就返回空:NULL

  2. 首先我们先判断刚开始的root和subroot的根相不相等?如果相等,然后再判断是否是相同的树

  3. 如果刚开始root->val!=subroot->val,不要着急!继续遍历root的左,右子树

(3)代码实现:

/**
 * 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)//if((p==NULL&&q!=NULL)||(p!=NULL&&q==NULL))
    {
        return false;
    }
    //两个都不为空
    //1.先判断不相等
    if(p->val!=q->val)
    {
        return false;
    }
    //2.如果相等
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);

}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
    if(root==NULL)
    {
        return false;
    }

    //2.首先我们先判断刚开始的root和subroot的根相不相等?如果相等,然后再判断是否是相同的树
    if(root->val==subRoot->val)
    {
        if(isSameTree(root,subRoot))
        {
            return true;
        }

        //return isSameTree(root,subRoot);不能这样写,因为如果这样写的话,可能root的下面可能有子树和传过来的subroot是相同的树,
        //但是你没有判断,直接return返回了,这样就有所欠缺!

        
    }
    //3.如果刚开始root->val!=subroot->val,不要着急!继续遍历root的左,右子树
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);

}

七、二叉树的构建及遍历

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

  1. 读入字符串
  2. 创建二叉树
  3. 中序打印二叉树

(3)代码实现:

#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
    char val;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

//MakeTree函数的意义在于将数组中的数据,以前序的方式创建一棵树
TreeNode* MakeTree(char* arr,int* n)
{
    if((arr[*n]=='#')||(arr[*n]=='\0'))
    {
        return NULL;
    }
    //我要将数组中的数据放入树中的前提:是我要先创造一个树。
    TreeNode* newtree=(TreeNode*)malloc(sizeof(TreeNode));
    newtree->val=arr[(*n)++];

    //newtree->left=MakeTree(arr,(*n)++);
    newtree->left=MakeTree(arr,n);
    (*n)++;
    newtree->right=MakeTree(arr,n);

    return newtree;
}

void InOrder(TreeNode* tree)
{
    if(tree==NULL)

    {
        return ;
    }
    InOrder(tree->left);
    printf("%c ",tree->val);
    InOrder(tree->right);
}

int main() {
    //int n = 0;
    //TreeSize(n);
    //int* arr = (int*)malloc(sizeof(int) * n);
    //scanf("%s", arr);
    char arr[101];
    scanf("%s",arr);
    int n=0;
    //创建一个n,作为一个我创建树的时候的一个标记指针,如果遇到空或者结尾的时候会返回
    TreeNode* tree=MakeTree(arr,&n);

    InOrder(tree);
    return 0;
}

好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
在这里插入图片描述

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

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

相关文章

Unity--互动组件(Input Field)||Unity--互动组件(Scroll View)

Unity--互动组件&#xff08;Input Field&#xff09; 一个输入字段是一种方法&#xff0c;使文本控件可编辑&#xff1b; 此组件中的&#xff0c;交互&#xff0c;过渡&#xff0c;导航与文章&#xff08;Unity--互动组件&#xff08;Button&#xff09;&#xff09;中的介绍…

网络基础:网络通信基础

目录 1.网络通信基本单位 2.网络通信基础 3.调制技术 4.解调技术 5.载波调制 6.编码技术 6.1基本编码 6.2应用型编码 1.曼彻斯特编码 2.差分曼彻斯特编码 3.MLT-3编码 4.mB/nB编码 1.网络通信基本单位 Byte&#xff08;字节&#xff09;是用于计量存储容量的一种…

YOLOv8如何输出COCO指标

1、先正常python train 一个模型 yolo taskdetect modetrain model/home//v8/v8-ori-x/yolov8x.pt data/home/v8/v8-ori-x/ultralytics/cfg/datasets/111.yaml epochs300 batch16 device62、再正常python val --各种参数 --save_jsonTrue&#xff0c;这一步的作用是要生成自己…

Tmux奇技淫巧

Tmux奇技淫巧 在日常的开发工作中&#xff0c;终端是我们最常用的工具之一。在终端中我们可以调用各种解释器&#xff0c;来执行命令&#xff0c;完成我们的工作。然而&#xff0c;对于只使用终端的默认功能的开发者来说&#xff0c;他们可能会错过一些强大的工具和技巧&#…

数据库设计实践:粒度的理解与应用示例

粒度是描述数据存储和表示的详细程度。在数据库设计中&#xff0c;理解和正确选择粒度是非常重要的&#xff0c;因为它直接影响到数据的存储效率、查询性能和数据分析的灵活性。 文章目录 粒度的类型&#xff1a;案例粒度选择的考虑因素实际应用 粒度的类型&#xff1a; 细粒度…

点击dom,出现黑色边框:focus-visible

正常情况 点击地图之后&#xff08;出现黑色边框&#xff09; 解决 添加这个css

详解原生Spring框架下的方法切入点表达式

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

网页中的json文档,怎么保存到本地

火狐浏览器操作方法 方法一 右键——>另存页面为 方法二 点击右边的三条横线——>另存页面为 谷歌浏览器操作方法 方法一 右键——>另存为 方法二

element-plus的走马灯carousel图片轮播让图片居中显示

element-plus的走马灯carousel图片轮播怎么让图片居中显示呢&#xff1f;官网里查了一下&#xff0c;没找到。只能自己摸索一下了。盒子模型&#xff0c;要让图片居中&#xff0c;首先要确定盒子的大小&#xff0c;然后确定图片的大小&#xff0c;盒子使用居中样式&#xff0c;…

24双非硕的秋招总结

24 双非硕的秋招总结 结果&#xff1a; 运气捡漏去了腾讯 想想自己整个研究生学习过程&#xff0c;还是挺坎坷的&#xff0c;记录一下&#xff0c;也给未来的同学提供一些参考。 研一 我是研一上开始学前端的&#xff0c;应该是21年10月份左右&#xff0c;我们实验室是专门…

配置中心--Spring Cloud Config

目录 概述 环境说明 步骤 创建远端git仓库 准备配置文件 配置中心--服务端 配置中心--客户端 配置中心的高可用 配置中心--服务端 配置中心--客户端 消息总线刷新配置 配置中心--服务端 配置中心--客户端 概述 因为微服务架构有很多个服务&#xff0c;手动一个一…

C++的explicit和隐式转换

隐式转换是指在某些情况下&#xff0c;编译器会自动进行类型转换&#xff0c;将一种类型的值转换为另一种类型&#xff0c;以满足表达式的要求。这种转换是隐式进行的&#xff0c;不需要显式地调用转换函数或构造函数。 int a 5; double b a; // int 到 double 的隐式转换上…

xxl-job 分布式任务调度框架

文章目录 分布式任务调度XXL-Job 简介XXL-Job 环境搭建XXL-Job (源码说明)配置部署调度中心docker安装 Bean模式任务(方法形式)-入门案例任务详解任务详解-执行器任务详解-基础配置任务详解-调度配置任务详解-基础配置任务详解-阻塞处理策略任务详解-路由策略 路由策略路由策略…

系统地自学 Python

文章目录 如何系统地自学 Python1. 选择合适的 Python 版本2. 安装 Python 和必要的工具3. 学习 Python 的基础知识4. 学习 Python 的高级特性5. Python 的应用领域6. 保持良好的学习习惯 如何系统地自学 Python Python 是一种广泛使用的编程语言&#xff0c;它具有简洁、易读、…

公众号文章采集器,免费的公众号文章采集

优质的公众号文章如同一座宝库&#xff0c;蕴含着丰富的知识和实用的信息。众多公众号纷繁复杂&#xff0c;如何高效地收集到优质文章成为许多人的难题。我们将专心分享如何收集优质公众号文章的方法&#xff0c;为您揭示收集优质文章的独门技巧。 如何高效收集公众号优质文章 …

【java智慧工地源码】智慧工地物联网云平台,实现现场各类工况数据采集、存储、分析与应用

“智慧工地整体方案”以智慧工地物联网云平台为核心&#xff0c;基于智慧工地物联网云平台与现场多个子系统的互联&#xff0c;实现现场各类工况数据采集、存储、分析与应用。通过接入智慧工地物联网云平台的多个子系统板块&#xff0c;根据现场管理实际需求灵活组合&#xff0…

【斗罗二】暗杀霍雨浩行动,马小桃霸气回击,江楠楠首秀武魂兔兔

Hello,小伙伴们&#xff0c;我是拾荒君。 《斗罗大陆Ⅱ绝世唐门》第25集更新了&#xff01;和小伙伴们一样&#xff0c;一更新&#xff0c;拾荒君就急不可待地观看这一集。故事情节高潮迭起&#xff0c;尤其是霍雨浩与王冬面对六名杀手的惊险场景&#xff0c;真是让人心跳加速…

clip-path,css裁剪函数

https://www.cnblogs.com/dzyany/p/13985939.html clip-path - CSS&#xff1a;层叠样式表 | MDN 我们看下这个例子 polygon里有四个值分别代表这四个点相对于原图左上方的偏移量。 裁剪个五角星

《算法通关村——原来滑动窗口如此简单》

《算法通关村——原来滑动窗口如此简单》 基本思想 滑动窗口的思想非常简单&#xff0c;如下图所示&#xff0c;假如窗口的大小是3&#xff0c;当不断有新数据来时&#xff0c;我们会维护一个大小为3的一个区间&#xff0c;超过3的就将新的放入老的移走。 这个过程有点像火车…

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示功能菜单应用

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示功能菜单应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍IIC通信简单介绍掉…