二叉树在线OJ

二叉树的构建及遍历

在这里插入图片描述
本题目的要求是:
输入一个数组,里面存放了若干个字符,#代表了空指针,数组中的顺序是
是先序遍历,然后要求你用中序输出
首先我们要做的就是构造结构体:

typedef struct TreeNode
{char val;struct TreeNode* left;struct TreeNode* right;
}TreeNode;

然后用先序遍历构造二叉树
当数组的首元素为#或者“\0”,即二叉树没有根节点,为空树,直接接返回
然后我们开辟新节点的空间
然后进行先序遍历构造二叉树:
首先将newnode的值置为数组首元素,同时下标count++
然后递归newnode的左子树根节点,*(count)++(count传的是地址,所以记得解引用),随后递归右子树根节点即可,最后返回newnode,就是二叉树的根节点

TreeNode* maketree(char*arr,int*count)
{if(arr[*count]=='#'||arr[*count]=='\0'){return NULL;}TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));newnode->val = arr[(*count)++];newnode->left = maketree(arr,count);(*count)++;newnode->right = maketree(arr,count);return newnode;
}

最后写一个中序遍历的输出:

void Inorder(TreeNode* root)
{if(root==NULL){return;}Inorder(root->left);printf("%c ",root->val);Inorder(root->right);
}

完整代码如下:

#include <stdio.h>
#include<stdlib.h>
typedef struct TreeNode
{char val;struct TreeNode* left;struct TreeNode* right;
}TreeNode;
TreeNode* maketree(char*arr,int*count)
{if(arr[*count]=='#'||arr[*count]=='\0'){return NULL;}TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));newnode->val = arr[(*count)++];newnode->left = maketree(arr,count);(*count)++;newnode->right = maketree(arr,count);return newnode;
}
void Inorder(TreeNode* root)
{if(root==NULL){return;}Inorder(root->left);printf("%c ",root->val);Inorder(root->right);
}int main()
{char arr[101];scanf("%s",arr);int count = 0;TreeNode* tree = maketree(arr,&count);Inorder(tree);return 0;
}
判断一颗二叉树是否是平衡二叉树

在这里插入图片描述
本题很简单了:
直接判断左子树和右子树的高度的绝对值是否小于等于1即可
同时左子树的子树和右子树的子树也要同时递归
调用求二叉树高度的函数

int height(struct TreeNode* root)
{if(root==NULL){return 0;}return fmax(height(root->left),height(root->right))+1;
}
bool isBalanced(struct TreeNode* root) 
{if(root==NULL){return true;}return fabs(height(root->left) - height(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
}
另一颗树的子树

在这里插入图片描述
在这里插入图片描述
本题就是判断一颗树的子树是否是另一棵树
所以我们首先要做的就是构造一个判断两棵树是否相等的函数:
当两个树同时为空时也是相等的
当其中一个为空时肯定时不想同的
当root的值不等于subroot的值时肯定是不相等的

bool issame(struct TreeNode* root,struct TreeNode* subroot)
{if(root==NULL&&subroot==NULL)return true;if(root==NULL||subroot==NULL)return false;if(root->val==subroot->val){if(issame(root->left,subroot->left)&&issame(root->right,subroot->right))return true;}return false;
}

然后调用这个函数:
当root和subroot相等时也符合题意

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{if(root==NULL)return false;if(issame(root,subRoot))return true;return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
对称二叉树

在这里插入图片描述
其实判断二叉树是否对称就是左边和右边比较,对折重合
即:
左子树和右子树相同,左子树的左子树后右子树的右子树相同
我们直接调用上一题的判断树是否相同的函数
然后拿左子树和右子树比较即可
当左子树的根节点和右子树的根节点不相等时只返回false

bool issame(struct TreeNode* rootleft,struct TreeNode* rootright)
{if(rootleft==NULL&&rootright==NULL)return true;if(rootleft==NULL||rootright==NULL)return false;if(rootleft->val==rootright->val){if(issame(rootleft->left,rootright->right)&&issame(rootleft->right,rootright->left))return true;}return false;
}
bool isSymmetric(struct TreeNode* root) 
{if(root->left==NULL&&root->right==NULL)return true;if(root->left==NULL||root->right==NULL)return false;if(root->left->val==root->right->val){if(issame(root->left,root->right))return true;}return false;
}
检查两颗树是否相同

这不简简单单,和之前的函数差不多,使用递归就是了
同时为空返回true
有一个为空返回false
两个根节点的值不相等返回false

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);
}
翻转二叉树

在这里插入图片描述
反转二叉树就是把左子树变成右子树,右子树变成左子树
很简单,直接先开辟空间存放,然后赋于即可

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;return root;
}
二叉树最大深度

在这里插入图片描述
最大深度不就是高度吗,就是层数啊
直接递归,就是左子树和右子树中深度大的那一个+1

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

在这里插入图片描述
单值二叉树就是二叉树所有节点的值都相等
二叉树为空符合题意,返回true
左子树和右子树为空符合题意,只有一个节点,返回true
当有一个不为空时,不为空子树根节点和根节点不相等直接返回false
当两个子树都不为空时判断两个子树的根节点是否相等,不相等直接返回false,然后递归左子树和右子树的根节点

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

好了,今天的分享到这里就结束了,谢谢大家!

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

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

相关文章

inux基础项目开发1:量产工具——业务系统(七)

前言&#xff1a; 前面我们已经构造出来显示系统、输入系统、文字系统、UI系统、页面系统&#xff0c;这个项目百分之八十需要实现的都已经构建出来了&#xff0c;最后让我们对这个项目进行最后一项系统的搭建&#xff0c;也就是业务系统&#xff0c;说到业务大家应该就知道我们…

解决ZED SDK安装后不可用,出现“核心已转储”的闪退问题

在陈述问题简单回顾下ZED SDK安装的步骤 ZED的运行需要显卡支持&#xff0c;cuda加速&#xff0c;因此需要提前安装好显卡驱动以及对应的cuda和cudnn&#xff0c;基础工作在此不再赘述&#xff0c;以下步骤默认已经完成上述准备工作。 建议新建一个虚拟环境以限定ZED使用的py…

飞行员兄弟

飞行员兄弟 思路&#xff1a; 这里一共有16个格子&#xff0c;如果暴力的话也就是2^16次方种排列组合。 这题和之前的开关不一样&#xff0c;这题是会影响到周围很多格子&#xff0c;而开关那题可以利用上方只改变一个的操作来解题&#xff0c;这题我想到的就是暴搜&#xff…

阿里微服务质量保障系列:性能监控最佳实践

建设一体化性能监控平台 随着互联网技术的不断发展&#xff0c;企业的业务规模和复杂度也在不断增加。为了保证业务的稳定性和可靠性&#xff0c;企业需要对其系统进行全面的性能监控。而一体化性能监控就是一种集成了多种监控工具和技术的综合性监控方案&#xff0c;可以帮助…

电源需要考虑的因素

做产品的都离不开电源&#xff0c;产品出问题也首先检查供电是否正常。今天给大家分享的是做好一个电源需要考虑哪些因素。 一&#xff0e; 描述输入电压影响输出电压几个指标形式 1&#xff0e; 稳压系数 A&#xff0e;稳压系数&#xff1a;表示负载不变时&#xff0c;稳压电源…

深度解析:整数和浮点数在内存中的存储

深度解析&#xff1a;整数和浮点数在内存中的存储 引言 在计算机科学中&#xff0c;理解整数和浮点数在内存中的存储方式是深入学习的关键一步。这篇博客将带你深入探讨整数和浮点数的内存表示&#xff0c;并通过代码实例详细解析其存储结构。 整数的内存存储 对于整形来说&a…

Redis命令详解

文章目录 Key&#xff08;键&#xff09; DEL EXISTS EXPIRE EXPIREAT PEXPIRE PEXPIREAT PERSIST KEYS TTL PTTL RENAME RENAMENX TYPE SCAN HSCAN SSCAN ZSCAN DUMP String&#xff08;字符串&#xff09; SET GET INCR DECR MSET MGET APPEND SETNX STRLEN INCRBY DECRBY IN…

Spark大数据集群日常开发过程遇到的异常及解决思路汇总

原创/朱季谦 在开发Spark任务过程中&#xff0c;遇到过不少新人经常可能会遇到的坑&#xff0c;故而将这些坑都总结了下来&#xff0c;方便日后遇到时&#xff0c;可以快速定位解决&#xff0c;壁面耗费过多时间在查找问题之上。 一、出现java.lang.IllegalAccessError: tried…

阻抗匹配电阻原理及其应用

一、匹配电阻的作用 1、阻抗匹配 当信号频率比较高&#xff0c;上升沿比较陡时&#xff0c;电子信号经过阻抗不同的地方时也会产设反射。 PCB的单线阻抗一般会设计成50Ω&#xff0c;发射端阻抗一般是17到40&#xff0c;而接收端一般是MOS管的输入&#xff0c;阻抗是比较大的…

【字符串匹配】【KMP算法】Leetcode 28 找出字符串中第一个匹配项的下标

【字符串匹配】【KMP算法】Leetcode 28 找出字符串中第一个匹配项的下标 &#xff08;1&#xff09;前缀和后缀&#xff08;2&#xff09;前缀表&#xff08;最长相同的前缀和后缀的长度&#xff09;&#xff08;3&#xff09;匹配过程示意&#xff08;4&#xff09;next数组的…

分享几个国内免费使用的 gpt 网站

可放心阅读点击&#xff0c;无邀请链接、邀请码等 今天主要分享几个个免费的GPT网站。 1、智晓星AiStar 智晓星AiStar 个人长期自用&#xff0c;界面简单&#xff0c;使用比较方便&#xff0c;支持验证码、微信登录。 对于免费用户来说&#xff0c;登录之后每天可以使用50…

系统地自学 Python

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

flutter使用动态路由传参的最小案例

flutter中使用动态路由传递参数的封装案例&#xff0c;子组件页面只需要接收arguments参数即可&#xff0c;参数是一个map&#xff0c;里面包含有所需要的参数&#xff0c;类似于json。在MaterialApp中配置onGenerateRoute&#xff0c;然后动态判断传递参数&#xff1a; route…

Rust国内sparse镜像源配置

文章目录 1. 遇到问题1.1 问题现象1.2 解决办法 2. 重新设置最新 sparse源3. 更多参考资料3.1 字节源3.2 ustc 源3.3 清华源3.4 其他人的总结 1. 遇到问题 有好一阵子没有更新源和安装软件了&#xff0c; 使用ustc的源&#xff0c; 更新了好一阵子&#xff0c; 最后安装居然还出…

费解的开关

费解的开关 模拟一下开关的过程&#xff1a; 直接对第一行进行开关灯即可&#xff0c;那么第一行开关等的方案有多少个呢&#xff1f; 可以第一个想到的是5次&#xff0c;但实际上是25次&#xff0c;因为没有规定说只能开关一次吧。 那么如何获得这32种方案呢&#xff1f; 可…

十五届海峡两岸电视主持新秀大会竞赛流程

海峡两岸电视主持新秀会是两岸电视媒体共同举办的一项活动&#xff0c;旨在为两岸年轻的电视主持人提供一个展示才华的舞台&#xff0c;促进两岸文化交流和青年交流。本届新秀会是第十二届海峡两岸电视艺术节的重要活动之一。本次竞赛赛制流程如下&#xff1a; &#xff08;1&…

springboot助农管理系统

springboot助农管理系统 成品项目已经更新&#xff01;同学们可以打开链接查看&#xff01;需要定做的及时联系我&#xff01;专业团队定做&#xff01;全程包售后&#xff01; 2000套项目视频链接&#xff1a;https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwdekjv 提…

初探Java之旅:探寻Java的奥秘

✨个人主页&#xff1a;全栈程序猿的CSDN博客 &#x1f4a8;系列专栏&#xff1a;Java从入门到精通 ✌座右铭&#xff1a;编码如诗&#xff0c;Bug似流星&#xff0c;持续追求优雅的代码&#xff0c;解决问题如同星辰般自如 在计算机编程的世界中&#xff0c;有一门被誉为“千变…

分享87个节日PPT,总有一款适合您

分享87个节日PPT&#xff0c;总有一款适合您 87个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1eUxA59uQ-hZWWpFzzDuCkQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

affinity好用还是ps好用?2024年最新功能解析

多年来&#xff0c;ps已经有了大量竞争对手。然而每次Photoshop都足以保持其领先地位。开源GIMP和Pixelmator都试图取代Photoshop&#xff0c;不过Photoshop对此不屑一顾。英国Serif公司研发了一款名为Affinity Photo的软件&#xff0c;声称可以叫板ps。今天我们看看有最有可能…