链式结构二叉树练习

一.二叉树的前序遍历

        想要输出所给值,就要先用数组将数据存储起来,所以这里我们单独创建一个前序遍历函数,将所要数据前序遍历并放入数组,代码如下:

void preOrder(struct TreeNode* root, int* a, int* pi)//前序遍历并将生成的二叉树放入数组
{
    if(root == NULL)
        return;
    a[(*pi)++] = root->val; //为了使形参改变实参,故这里传递地址。
    preOrder(root->left, a, pi);
    preOrder(root->right, a, pi);
}

又因为题目要求返回一个returnSize的指针,所以这里我们再单独创建一个计算树的大小的函数:

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

此题所给函数形参中没有数组,所以我们要单独开辟一段空间来放数组,用malloc函数,最后直接返回数组即可.

代码如下:

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);
    int* a = (int*)malloc(sizeof(int) * (*returnSize));  
    int i = 0;
    preOrder(root, a, &i);
    return a;
}

综上,代码如下:

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

void preOrder(struct TreeNode* root, int* a, int* pi)//前序遍历并将生成的二叉树放入数组
{
    if(root == NULL)
        return;
    a[(*pi)++] = root->val; 
    preOrder(root->left, a, pi);
    preOrder(root->right, a, pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);
    int* a = (int*)malloc(sizeof(int) * (*returnSize));  
    int i = 0;
    preOrder(root, a, &i);
    return a;
}

二.相同的树

此题判断相同的树,题中函数给的形参给了两个结构体指针,我们可以从指针是否为空处下手来判断是否相等:即两树都为空则相等,若有一个为空则不相等,最后两数的节点值相等,再进行递归即可,代码如下:

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);//其左右子树必须都满足才能返回true
//且最后一直读取读到空都没有返回false,则进入第一个条件判断返回空.
}

三.对称二叉树

对称二叉树的判断与上题类似,需要两个结构体指针形参,所以我们再创建一个函数,题目所给函数则用于返回值,代码如下:

bool _isSymmetric(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 _isSymmetric(p->left, q->right)
        && _isSymmetric(p->right, q->left);
}

bool isSymmetric(struct TreeNode* root) {
    return _isSymmetric(root->left, root->right);
}

四.另一颗树的子树

该题要判断另一棵树是否为本树的子树,需要用到判断树相等的函数:

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))); 
}

首先,我们要明白:什么情况下我们才会对此树进行判断,那就是只有根节点值相同且通过树相等函数判断返回true的树.代码如下:

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

    if((root->val == subRoot->val)
    && isSameTree(root, subRoot))
    {
        return true;
    }

    return isSubtree(root->left, subRoot)//可能为左右子树中任意一个子树,所以用'||'运算符
        || isSubtree(root->right, subRoot);
}

五.二叉树遍历

该题要求通过前序遍历创建二叉树,代码如下:

BTNode* CreateTree(char* a, char* pi)
{
    if(a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    root->val = a[(*pi)++];
    root->left = CreateTree(a, pi);
    root->right = CreateTree(a, pi);
    return root;
}

本题需要中序遍历打印出二叉树,所以我们写一个中序遍历函数:

void InOrder(BTNode* 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;
}BTNode;

BTNode* CreateTree(char* a, char* pi)
{
    if(a[*pi] == '#')//当读取到'#'时返回空然后pi++接着读取下一个元素
    {
        (*pi)++;
        return NULL;
    }

    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    root->val = a[(*pi)++];//将数组里的值放入根节点
    root->left = CreateTree(a, pi);//此处为前序遍历
    root->right = CreateTree(a, pi);
    return root;
}

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		return; 
	}

	InOrder(root->left);//此处为中序遍历
	printf("%c ", root->val);
	InOrder(root->right);
}

int main() 
{
    char a[100];//本题说不超过100字符的空间
    scanf("%s", a);
    int i = 0;
    BTNode* root = CreateTree(a, &i);
    InOrder(root);
    return 0;
}

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

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

相关文章

鸿蒙开发系统基础能力:【@ohos.pasteboard (剪贴板)】

剪贴板 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import pasteboard from ohos.pasteboard;属性 系统能力: 以下各项对应的系统能力均为SystemCapability.MiscServices.Pasteb…

2024车载测试还可以冲吗?

2024年已过接近1/4了&#xff0c;你是不是还在围观车载测试行业的发展&#xff1f;同时也在思考着&#xff1a;现在进入车载测试行业还来得及吗&#xff1f;如何高效学习车载测试呢&#xff1f; 我们先来了解一下车载测试行情发展&#xff0c;通过某大平台&#xff0c;我们获取…

解决pycharm安装dlib失败的问题

今天使用pycharm来学习opencv人脸识别库face-recognition的时候出现了一点小问题&#xff0c;在pycharm中直接安装face-recognition会失败&#xff0c;说是因为缺少依赖库dlib&#xff0c;但是直接使用pycharm安装dlib库也有问题&#xff0c;不知道大家遇到没有 错误提示 note…

Avue-data数据大屏显示饼图(附Demo)

目录 前言1. Sql查询2. 颜色细节 前言 对于这部分知识&#xff0c;原先有过柱状图实战&#xff1a;Avue-data数据大屏显示柱状图&#xff08;附Demo讲解&#xff09; 以下直奔主题&#xff0c;以Sql数据库数据为主 1. Sql查询 以饼图为例&#xff0c;需要返回的形式如下&am…

MySQL数据库切换瀚高数据库(PostgreSQL)导致SQL适配问题:BadSqlGrammarException

温馨提示&#xff1a; 下面的出现的情况属于层层递进的&#xff0c;如果只解决其中一种情况会接着报下一个情况&#xff0c;如果只想了解解决方案请直接移步至结论。 1. 情况一&#xff1a;ERROR: operator does not exist: smallint character varying 报错详细描述&#xf…

每日一学(1)

目录 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 2、ThreadLocal会出现内存泄露吗&#xff1f; 3、AQS理解 4、lock 和 synchronized的区别 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 底层 putVal方法 中 如果key || value为空 抛出…

python-登录界面-demo

文章目录 前言python-登录界面-demo 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! python-…

Wp-scan一键扫描wordpress网页(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

如何解决ssh远程连接自动断开的问题

文章目录 1. 问题描述2. 配置SSH设置2.1 调整服务器端的设置2.2 调整客户端的设置 3. 调整用户断开时长 1. 问题描述 SSH 远程连接断开是一个常见的问题&#xff0c;尤其是在网络不稳定或长时间没有活动时。文本介绍一些常见的方法和技巧来保持 SSH 连接稳定和避免断开。 2. …

第十八课,函数基本语法规则

一&#xff0c;编程中函数的介绍 函数像一个黑盒子、加工厂、榨汁机等等&#xff08;你能想到的任何类似的比喻&#xff09;&#xff0c;它会经过一个固定的规则将你送入其中的参数变成另一个样子、或者实现某种预想的功能&#xff08;比如print()函数、input()函数、以及在tu…

33 超级数据查看器 高级搜索

大家好&#xff0c;今天我们讲一下超级数据查看器的高级搜索功能&#xff0c; 超级数据查看器是一个安卓APP。具有数据管理和数据查询功能。 能够将Excel文件、文本导入&#xff0c;转为手机数据库&#xff0c;实现快速查询&#xff0c;实现自动构建手机端的查询系统。 今天我…

【python】python入门day1

python入门 Python解析器Python注释Python中的变量&#xff08;重点&#xff09;练习&#xff1a;1、用python的print函数描述一段对话2、与计算机模拟一段对话&#xff0c;并且最终计算机需要将输入的内容全部输出3、模拟两个对话场景(根据提示输入内容&#xff0c;并且在后续…

MS31011低压 5V DC 电机驱动

MS31011 是一款低压 5V 直流电机驱动芯片&#xff0c;为摄像机、消 费类产品、玩具和其他低压或者电池供电的运动控制类应用提 供了集成的电机驱动解决方案。 MS31011 能提供高达 0.8A 的输出电流。可以工作在 2.0~5.5V 的电源电压上。 MS31011 具有 PWM &#x…

day21--669. 修剪二叉搜索树 +108.将有序数组转换为二叉搜索树+538.把二叉搜索树转换为累加树

一、669. 修剪二叉搜索树 题目链接&#xff1a;https://leetcode.cn/problems/trim-a-binary-search-tree/ 文章讲解&#xff1a;https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html 视频讲解&#xff1a;https://www.bi…

B=MAP执行力公式 | 一条公式参透执行力的本质

&#x1f9d0;什么是【福格行为模型】呢&#xff1f;这个模型是斯坦福大学行为研究院院长福格教授提出的&#xff0c;一个【行为 Behavior】的发生&#xff0c;主要是由【动机 Motivation】、【能力 Ability】和【提示 Prompt】决定&#xff0c;即【BMAP】 &#x1f308;【动机…

【揭秘新潮流】实践教学新宠SmartEDA,让电子设计课“潮“起来!

在信息时代的浪潮下&#xff0c;电子设计课程早已不再是枯燥乏味的代名词。随着技术的飞速发展&#xff0c;一种名为SmartEDA的实践教学新选择正逐渐崭露头角&#xff0c;为电子设计课程注入了前所未有的活力与趣味性。今天&#xff0c;就让我们一起走进SmartEDA的世界&#xf…

封装图片占位图组件

<laze-image class="image" :url="item.image" :game_name="item.game_name" :placeholder="require(@/static/images/common/placeholder.png)"></laze-image> 1.通过调用组件实现 先加载预览图片,再加载真实的图片 2…

Git的安装配置及使用(超详细!!!)

一、git概述 它是一个版本管理工具. 版本: 软件开发过程当中的重要节点. 作用: 团队协作,管理代码. 对于软件的学习, 会用就行. 1.1 安装及配置 下载地址: github.com 安装注意事项: 傻瓜式安装,一直下一步就好. 安装目录不要有中文. 尽量也不要有空格. 配置环境变量: 找到…

未来出行新选择——加油宝APP,让您的每一次加油都充满智慧与便捷!

一、前言 随着科技的飞速发展&#xff0c;智能手机已经成为我们生活中不可或缺的一部分。为了满足广大车主对便捷、高效加油服务的需求&#xff0c;我们倾力打造了全新的加油宝APP。这款APP不仅为您提供一站式的加油服务&#xff0c;还融合了多项创新功能&#xff0c;让您的出…

注意!!2024下《系统分析师》易混淆知识点来了,赶紧收藏

宝子们&#xff0c;在复习软考系统分析师中&#xff0c;是不是觉得有很多知识点含义比较相近&#xff0c;很多友友刚看的时候估计会像我一样迷迷糊糊的&#xff0c;作为一个软考老鸟&#xff0c;在这里给大家整理了系分学习过程中易混淆的知识点&#xff0c;大家认真复习就行&a…