二叉树在线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);
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:232. 用栈实现队列

一、题目 原题链接&#xff1a;232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; typedef struct //我的队列结构定义 { } MyQueue; MyQueue* myQueueCreate() //我的队列创建及其初始化 void myQueuePush(MyQueue* obj, int x) //我的队…

shell编程awk命令详解(超详细)

文章目录 前言一、awk命令介绍1. awk命令简介2. awk命令的基本语法3. 常用的awk命令选项4. 常用的awk内置变量 二、awk命令示例用法1. 打印整行2. 打印特定字段3. 根据条件筛选行4. 自定义分隔符5. 从文件中读取awk脚本 总结 前言 awk命令是一种强大的文本处理工具&#xff0c…

【理解ARM架构】中断处理 | CPU模式

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f35c;中断&#x1f368;GPIO中断代码实现 &#x1f35c;CPU&#x1f368;CONTROL…

Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 队列的说明 1.1 队列的几种常用操作 2.0 使用链表实现队列说明 2.1 链表实现队列 2.2 链表实现队列 - 入栈操作 2.3 链表实现队列 - 出栈操作 2.4 链表实现队列 …

机器学习笔记 - 什么是3D语义场景完成/补全?

一、什么是3D语义场景补全? 3D 语义场景完成(Semantic Scene Completion)是一种机器学习任务,涉及以体素化形式预测给定环境的完整3D场景(完成3D形状的同时推断场景的 3D 语义分割的任务)。这是通过使用深度图和为场景提供上下文的可选 RGB 图像来完成的。目标是以一种可轻…

2023年腾讯云双12优惠活动整理汇总

2023年双12腾讯云推出了年末感恩回馈活动&#xff0c;年度爆款2核2G4M云服务器118元/年&#xff0c;新老用户同享&#xff0c;还可领取总面值2000元代金券&#xff0c;老用户服务器续费4折起。本文为大家整理汇总腾讯云双12优惠活动。 活动地址&#xff1a; 点此直达腾讯云双1…

linux常用命令-find命令与scp命令详解(超详细)

文章目录 前言一、find命令介绍1. find命令简介2. find命令的基本语法3. 常用的find命令选项和表达式 二、find命令示例用法1. 按照名称进行搜索2. 按照类型进行搜索3. 按照修改时间进行搜索4. 按照文件大小进行搜索5. 对搜索到的文件执行指定的命令6. 删除搜索到的文件 三、sc…

23种设计模式之C++实践(二)

23种设计模式之C++实践 3. 设计模式(二)组合型模式7. 适配器模式——不兼容结构的协调7.2:类适配器模式7.3:双向适配器模式适配器模式总结8.桥接模式——处理多维度变化桥接模式总结9. 组合模式——树形结构的处理9.2 透明组合模式9.3 安全组合模式组合模式总结10. 装饰模式…

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。 流程配置ncnn android yolov5导出自己模型的ncnn修改yolo.py文件导出TorchScript文件pnnx转torchscript为ncnn 安卓运行权重路径输入输出anchors 大小类别名generate_proposals方法修改 结果 流程 网络yolov5 的部署已经有很多了…

分享一个国内可用的免费GPT4-AI提问AI绘画网站工具

一、前言 ChatGPT GPT4.0&#xff0c;Midjourney绘画&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GPT-4对普…

Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

1、背景 集群配置为&#xff1a;8 个 node 节点&#xff0c;16 核 32G&#xff0c;索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高&#xff0c;search 没有慢查询的状态。 2、集群压测性能不能上去&#xff0c;cpu 使用未打…

mybatis的一级缓存和二级缓存

mybatis的一级缓存和二级缓存 mybatis设计两级缓存来提高查询效率。 一级缓存是SqlSession级别&#xff0c;每个会话都需要创建一个sqlsession&#xff0c;避免同一个用户在多次查询中每次都去查询数据库就把查询结果做了缓存 二级缓存 跨SqlSession的缓存&#xff0c;以及缓存…

C#——Delegate(委托)与Event(事件)

C#——Delegate&#xff08;委托&#xff09;与Event&#xff08;事件&#xff09; 前言一、Delegate&#xff08;委托&#xff09;1.是什么&#xff1f;2.怎么用&#xff1f;Example 1&#xff1a;无输入无返回值Example 2&#xff1a;有输入Example 3&#xff1a;有返回值Exa…

抖音外卖商品模型

目录 一、抖音外卖商品模型 二、商家运营流程 &#xff08;一&#xff09;商家入驻流程 &#xff08;二&#xff09;商品发布流程 三、推广带货流程 &#xff08;一&#xff09;短视频带货 &#xff08;二&#xff09;直播视频带货 【直播工具】 【直播流程】 直播前…

SQL Server 数据库,创建数据表(使用T-SQL语句)

2.3表的基本概念 表是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似&#xff0c;都是 按行和列的格式组织的&#xff0c;每行代表一条唯一的记录&#xff0c;每列代表记录中的一个字段.例如&#xff0c;在包含公 司员工信息的表中&#xff0c;每行…

数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)

目录 一.双向链表的概念 二.双向链表的数据结构 三.双向链表的实现 节点的插入 头插法 尾插法 任意位置插入 节点的删除 删除链表中第一次出现的目标节点 删除链表中所有与关键字相同的节点 节点的查找 链表的清空 链表的长度 四.模拟实现链表的完整代码 前言&am…

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

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

位图布隆过滤器(附面试题)

文章目录 目录 文章目录 前言 一 . 位图 1.1 面试题 1.2 位图概念 1.3 位图的实现 1.4 位图的应用 二 . 布隆过滤器 2.1 布隆过滤器提出 2.2布隆过滤器概念 2.3 布隆过滤器的查找 2.4 实现 2.5 布隆过滤器删除 2.6 布隆过滤器优点 2.7 布隆过滤器缺陷 2.8 布隆过滤器使用场景 三…

面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

前言 面试时&#xff0c;我们说完Vue响应式原理&#xff0c;或者Vue2和Vue3的区别时&#xff0c;通常会引出Vue3使用了Proxy来优化响应式&#xff0c;而面试官会继续深挖&#xff1a;说说Proxy与Object.defineProperty的区别。 我们不能只说Proxy直接代理一个对象&#xff0c…

【java毕业设计源码】基于SSM框架的在线智能题库管理系统设计与实现

该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍&#xff1a; 二、文档学习资料&#xff1a; 三、模块截图&#xff1a; 四、开发技术与运行环境&#xff1a; 五、代码展示&#xff1a; 六、数据库表截图&#xff1a…