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

链式二叉树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.mzph.cn/news/191192.shtml

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

相关文章

docker容器中创建非root用户

简介 用 docker 也有一段时间了&#xff0c;一直在 docker 容器中使用 root 用户肆意操作。直到部署 stable diffusion webui 我才发现无法使用 root 用户运行它&#xff0c;于是才幡然醒悟&#xff1a;是时候搞个非 root 用户了。 我使用的 docker 镜像文件是 centos:centos…

LeetCode的几道题

一、捡石头 292 思路就是&#xff1a; 谁面对4块石头的时候&#xff0c;谁就输&#xff08;因为每次就是1-3块石头&#xff0c;如果剩下4块石头&#xff0c;你怎么拿&#xff0c;我都能把剩下的拿走&#xff0c;所以你就要想尽办法让对面面对4块石头的倍数&#xff0c; 比如有…

Linux shell中的函数定义、传参和调用

Linux shell中的函数定义、传参和调用&#xff1a; 函数定义语法&#xff1a; [ function ] functionName [()] { } 示例&#xff1a; #!/bin/bash# get limit if [ $# -eq 1 ] && [ $1 -gt 0 ]; thenlimit$1echo -e "\nINFO: input limit is $limit" e…

CPU 使用率和负载Load

优质博文&#xff1a;IT-BLOG-CN 一、CPU 使用率 CPU使用率是 CPU处理非空闲任务所花费的时间百分比 。例如单核CPU 1s内非空闲态运行时间为0.8s&#xff0c;那么它的CPU使用率就是80%&#xff1b;双核CPU 1s内非空闲态运行时间分别为0.4s和0.6s&#xff0c;那么&#xff0c;…

IDEA2023安装教程(超详细)

文章目录 前言安装IntelliJ IDEA1. 下载IntelliJ IDEA2. 运行安装程序3. 选择安装路径4. 选择启动器设置5. 等待安装完成6. 启动IntelliJ IDEA7. 配置和设置8. 激活或选择许可证9. 开始使用 总结 前言 随着软件开发的不断发展&#xff0c;IntelliJ IDEA成为了许多开发人员首选…

基于JSP的网络考试系统/在线考试系统的设计与实现

摘 要 网络考试系统是由高校的一个网络考试&#xff0c;按照章程自主开展网络考试系统。网络考试是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高学生综合素质、引导学生适应社会、促进学生成才就业等方面发挥着重要作用&#xff0c;是新形势下有效凝…

RHCE学习笔记(RHEL8) - RH294

Chapter Ⅰ 介绍Ansible ansible ansible是一款开源自动化平台 ansible围绕一种无代理架构构建&#xff0c;在控制节点上安装ansible&#xff0c;且客户端不需要任何特殊的代理软件&#xff1b;ansible使用SSH等标准协议连接受管主机&#xff0c;并在受管主机上运行代码或命令来…

在cmd下查看mysql表的结构信息

我提前已经在mysql数据库中创建了一个表&#xff1a; 在cmd下&#xff0c;登录mysql以后&#xff0c;使用命令describe 表名、或者explain 表名可以查看表结构信息。但在实践中&#xff0c;查看表结构&#xff0c;多用describe命令&#xff0c;而查看执行计划用explain。 例…

p标签在div中居中

新建一个html文件&#xff0c;命名为test.html&#xff0c;用于讲解如何在css中让div中的p标签居中。 在test.html文件内&#xff0c;在div内&#xff0c;使用p标签创建一行文字&#xff0c;用于测试。 在test.html文件内&#xff0c;设置div标签的class属性为mydiv。 在…

计算机网络扫盲(1)——因特网

一、概述 因特网是一个世界范围的计算机网络&#xff0c;即它是一个互联了遍及全世界数十亿计算设备的网络。大家对此应该并不陌生&#xff0c;我们身边有着不计其数的计算机设备被接入了因特网&#xff0c;如今计算机网络这个术语似乎已经有点过时了&#xff0c;用因特网的术语…

CRM系统是怎样帮助销售流程自动化的?

销售业绩是衡量企业经营的重要指标&#xff0c;也是销售人员一直要达成的目标。销售业绩能否提高取决于销售人员的能力、客户服务水平&#xff0c;还需要借助有效的工具。CRM系统就是这样的一款软件。企业如何提高销售业绩&#xff1f;不妨试试CRM销售流程自动化。 CRM如何实现…

【C语言:数据在内存中的存储】

文章目录 1.整数在内存中的存储1.1整数在内存中的存储1.2整型提升 2.大小端字节序2.1什么是大小端2.2为什么有大小端之分 3.整数在内存中的存储相关题目题目一题目二题目三题目四题目五题目六题目七 4.浮点数在内存中的存储4.1浮点数存的过程4.2浮点数取得过程 在这之前呢&…

openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志

文章目录 openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志137.1 检查操作系统日志137.2 检查openGauss运行日志137.3 清理运行日志 openGauss学习笔记-137 openGauss 数据库运维-例行维护-检查和清理日志 日志是检查系统运行及故障定位的关键手段。建议按…

Windows下安全认证机制

NTLM&#xff08;NT LAN Manager&#xff09; NTLM协议是在Microsoft环境中使用的一种身份验证协议&#xff0c;它允许用户向服务器证明自己是谁&#xff08;挑战&#xff08;Chalenge&#xff09;/响应&#xff08;Response&#xff09;认证机制&#xff09;&#xff0c;以便…

TA-Lib学习研究笔记(八)——Momentum Indicators 中

TA-Lib学习研究笔记&#xff08;八&#xff09;——Momentum Indicators 中 Momentum Indicators 动量指标&#xff0c;是最重要的股票分析指标&#xff0c;能够通过数据量化分析价格、成交量&#xff0c;预测股票走势和强度&#xff0c;大部分指标都在股票软件中提供。 11. …

对el-select封装成组件使用

效果与直接使用el-select一样&#xff0c;多处用el-select显得代码冗余就进行了封装 效果图&#xff1a; el-select封装&#xff1a; <template><div class"my-select"><el-selectv-model"person.modelValue":placeholder"placehold…

Linux中的文件IO

文章目录 C语言文件操作系统文件I/O接口介绍 open函数返回值文件描述符fd0 & 1 & 2文件描述符的分配规则 重定向使用 dup2 系统调用 FILE理解文件系统理解硬链接软链接acm 动态库和静态库静态库与动态库生成静态库生成动态库&#xff1a; C语言文件操作 先来段代码回顾…

DBeaver 社区版(免费版)下载、安装、解决驱动更新出错问题

DBeaver 社区版&#xff08;免费版&#xff09; DBeaver有简洁版&#xff0c;企业版&#xff0c;旗舰版&#xff0c;社区版&#xff08;免费版&#xff09;。除了社区版&#xff0c;其他几个版本都是需要付费的&#xff0c;当然相对来说&#xff0c;功能也要更完善些&#xff…

Fiddler抓包工具之fiddler设置过滤

fiddler设置过滤 基本的过滤操作流程以百度为例 步骤&#xff1a; 1、右侧高级工具栏点击Filters》勾选Use Filters》选择Show only Internet Hosts和Show only the following Hosts》在文本框中输入host地址 2、点击Changes not yet saved》再点击Actions》Run Filterset …

Azure Machine Learning - 在 Azure AI 搜索中创建全文查询

Azure AI搜索中如果要为全文搜索生成查询&#xff0c;本文提供了设置请求的步骤。 本文还介绍了查询结构&#xff0c;并说明了字段属性和语言分析器如何影响查询结果。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&a…