二叉树在线OJ

news2025/1/21 10:22:21
二叉树的构建及遍历

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

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.coloradmin.cn/o/1279999.html

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

相关文章

游泳馆会员服务预约管理系统预约小程序效果如何

游泳馆在各地每天都有大量用户前往&#xff0c;夏季室外、冬季室内也是学习游泳技术和休闲娱乐的好地方&#xff0c;而消费者大多是年轻人和家长带的孩子&#xff0c;这部分群体更显年轻化&#xff0c;因此在如今互联网环境下&#xff0c;传统商家需要进一步赋能客户消费路径。…

《凤凰项目》读书笔记

文章目录 一、书名和作者二、书籍概览2.1 主要论点和结构2.2 目标读者和应用场景 三、核心观点与主题3.1 DevOps的核心原则与文化变革3.2 持续交付与自动化3.3 变更管理与风险控制3.4 关键绩效指标与持续改进 四、亮点与启发4.1 最有影响的观点4.2 对个人专业发展的启示 五、批…

Mover Creator 用户界面

1 “开始”对话框 首次打开 Mover Creator 时&#xff0c;出现的第一个页面是“开始”对话框&#xff0c;如下所示。从这里开始&#xff0c;用户可以选择开始设计飞机、武器或发动机。在上述每种情况下&#xff0c;用户都可以创建新模型或编辑现有模型。 1.1 新建模型 如果用…

【选择题】校招笔试选择题第一辑

题目 以下程序的运行结果是&#xff08; &#xff09; #include <stdio.h> int main(void) {printf("%s , %5.3s\n", "computer", "computer");return 0; }A. computer , puter B. computer , com C. computer , computer D. computer…

Linux的权限(一)

目录 权限的本质 Linux权限的概念 如何创建与删除普通用户 创建普通用户&#xff1a; 设置用户密码&#xff1a; 删除普通用户&#xff1a; 删除与该用户关联的主目录和邮件目录 &#xff1a; su指令 sudo指令 Linux权限管理 Linux中文件访问者有三种“人” Linux…

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

可放心阅读点击&#xff0c;无邀请链接、邀请码等 今天主要分享几个个免费的GPT网站。 1、思默问答&#xff08;SiteSMO&#xff09; AI写作生成器_智能写作_问答助手 - 思默问答 算是国内比较早的AI应用网站&#xff0c;支持问答&#xff0c;画图等&#xff0c;所有的问答…

Pandas时序数据分析实践—基础(1)

目录 1. Pandas基本结构2. Pandas数据类型2.1. 类型概述2.1.1. 整数类型&#xff08;int&#xff09;&#xff1a;2.1.2. 浮点数类型&#xff08;float&#xff09;&#xff1a;2.1.3. 布尔类型&#xff08;bool&#xff09;&#xff1a;2.1.4. 字符串类型&#xff08;object&a…

Java中异常处理顺序和全局异常处理器

异常处理顺序 我们直接通过代码看下Java中异常的处理顺序。 数组越界异常属于运行时异常&#xff0c;被捕捉后就停止了&#xff0c;打印结果为数组越界了。 Test public void test2(){int[] arr new int[4];try{System.out.println(arr[5]);}catch (ArrayIndexOutOfBoundsE…

uniapp 使用安卓模拟器运行

uniapp 启动方式有很多种,这里介绍使用模拟器启动uniapp 要使用模拟器启动uniapp肯定少不了安装模拟器(废话) 这里选着浏览器推荐的第一个模拟器mumu模拟器 下载好了mumu安装包后就是安装了,这个过于小白,就不介绍了 2. 查看模拟器的adb端口号, mumu的adb查看端口号与众不同…

C++-内联函数

目录 一.什么是内联函数 1.内联函数的概念 2.内联函数的定义 二.C中引入内联函数的原因 三.什么样的函数适合被声明为内联呢&#xff1f; 四.面试题 一.什么是内联函数 1.内联函数的概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开…

Python如何优雅地使用重试:tenacity

1 缘起 项目中使用了第三方服务&#xff0c;和上一篇文章一样&#xff1a;SpringBoot中如何优雅地使用重试https://blog.csdn.net/Xin_101/article/details/134617868 在调用第三方服务时&#xff0c;出现第三方服务连接不到的情况&#xff0c;为了保证服务的相对稳定&#xf…

糟了,数据库崩了,又好像没崩

前言 2023 年某一天周末&#xff0c;新手程序员小明因为领导安排的一个活来到公司加班&#xff0c;小明三下五除二&#xff0c;按照领导要求写了一个跑批的数据落库任务在测试环境执行 &#xff0c;突然间公司停电了&#xff0c;小明大惊&#xff0c;“糟了&#xff0c;MySQL …

每天一点python——day84

#每天一点Python——84 #异常处理机制try—except—else #异常处理机制try—except—else如果try块中没有抛出异常&#xff0c;则执行else块&#xff0c;如果try中抛出异常&#xff0c;则执行except块#示例&#xff1a; try:a int(input(请输入第一个整数&#xff1a;))b in…

【JavaEE】多线程(3) -- 线程等待 wait 和 notify

目录 1. wait()⽅法 2. notify()⽅法 3. notifyAll()⽅法 4. wait 和 sleep 的对⽐&#xff08;⾯试题&#xff09; 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序. 完成这个协调⼯…

【ArcGIS Pro微课1000例】0044:深度学习--面部模糊(马赛克)

本文讲解ArcGIS Pro中通过深度学习工具实现人脸面部模糊,起到马赛克的作用。 文章目录 一、效果对比二、工具介绍三、案例实现一、效果对比 原始图片: 深度学习后的模糊照片: 二、工具介绍 本工具为ArcGIS Pro工具箱中的深度学习工具中的:使用深度学习分类像素,如下所示…

ChatGPT 的 18 种玩法,你还不会用吗?

你确定&#xff0c;你会使用 ChatGPT 了吗&#xff1f; 今天给大家整理了 18 种 ChatGPT 的用法&#xff0c;看看有哪些方法是你能得上的。 用之前我们可以打开R5Ai平台&#xff0c;可以免费使用目前所有的大模型 地址&#xff1a;R5Ai.com 语法更正 用途&#xff1a;文章…

ER图是什么,怎么画?

ER图&#xff08;Entity-Relationship Diagram&#xff09;是一种用于描述实体间关系的图形化表示方法。它主要用于数据库设计&#xff0c;可以清晰地展示实体、属性和实体间的联系。常用的ER图类型包括&#xff1a; 实体-关系模型&#xff08;Entity-Relationship Model&…

Shutdown Signal: channel error; protocol method: #method<channel.close>

完整异常信息&#xff1a; Shutdown Signal: channel error; protocol method: #method<channel.close>(reply-code404, reply-textNOT_FOUND - no exchange fanoutExchange in vhost /, class-id60, method-id40) 意思是找不到名字是 fanoutExchange 的虚拟机 就是虚拟机…

基于SSH三大框架的员工管理系统

基于SSH三大框架的员工管理系统 摘要 本系统为本人学习SSH三大框架时所做的整合实例&#xff0c;系统角色包括普通用户和管理员两种&#xff0c;首页有管理员登录入口链接。系统功能主要包括管理员对用户的基本增、删、改、查和分页显示用户信息等。 系统环境 本系统使用ec…

Gossip 协议

Gossip 协议 背景 在分布式系统中&#xff0c;不同的节点进行数据/信息共享是一个基本的需求。 一种比较简单粗暴的方法就是 集中式发散消息&#xff0c;简单来说就是一个主节点同时共享最新信息给其他所有节点&#xff0c;比较适合中心化系统。这种方法的缺陷也很明显&…