暴力数据结构之二叉树的代码练习

1.二叉树的遍历 

来源:牛客网

解题思路:这里首先第一个遇到的难点就是如何创建一棵树, 我们知道树的创建首先就是找到根结点,然后创建左右子树,所以这里是利用前序创建一棵树。

根据题目,#就是一个叶子结点,所以遍历到'#'就直接返回NULL,反之递归创建树。

当然中序遍历就很简单了,也是使用递归。代码如下:

#include <stdio.h>
#include<stdlib.h>

typedef struct BinaryTree
{
     struct BinaryTree* left;
     struct BinaryTree* right;
     char val;
}BTNode;

//前序找根节点
BTNode* CreateTree(char* a,int* 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);
}

int main() 
{
    char a[100];
    scanf("%s",a);

    int i = 0;
    BTNode* root = CreateTree(a,&i);
    InOrder(root);

    return 0;
}

2. 二叉树的前序遍历

来源:leetcode

解题思路: 首先要动态申请一块空间存储二叉树中的数据,当然要知道申请的空间大小,就要创建一个TreeSize函数计算,然后设计一个前序遍历函数,利用递归实现。中序与后序只是变换了顺序,本质不改变。

代码如下

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

3. 二叉树的中序遍历

来源:leetcode

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

void InOrder(struct TreeNode*root,int* a,int* pi)
{
    if(root == NULL)
    {
        return;
    }
    
    InOrder(root->left,a,pi);
    a[(*pi)++] = root->val;
    InOrder(root->right,a,pi);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize) 
{    
    *returnSize = TreeSize(root);
    int* a = (int*)malloc(sizeof(int) * (*returnSize));

    int i = 0;
    InOrder(root,a,&i);

    return a;
}
4. 二叉树的后序遍历

来源:leetcode

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

void PostOrder(struct TreeNode *root,int* a,int*pi)
{
    if(root == NULL)
    {
        return ;
    }

    PostOrder(root->left,a,pi);
    PostOrder(root->right,a,pi);
    a[(*pi)++] = root->val;
}

int* postorderTraversal(struct TreeNode* root, int* returnSize) 
{    
    *returnSize = TreeSize(root);
    int* a = (int*)malloc(sizeof(int) * (*returnSize));

    int i = 0;
    PostOrder(root,a,&i);

    return a;
}

5. 另一棵树的子树

来源:leetcode

思路解析: 判断是否为子树可以从左子树到右子树,只要有一个个符合就 停止判断,所以首先实现一个判等函数isSameTree函数,然后判断原树是否为空,为空则直接返回NULL,反之判断是否满足根节点的值与整棵子树是否同时相同,最后递归调用原函数即可。

代码如下:

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

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

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

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

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

相关文章

C++系列-static成员

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;用static修饰的成员函数&#xff0c;称之为静态成…

基于集成经验模态分解的心电信号降噪和基于希尔伯特变换的R峰检测(MATLAB R2018)

近年来&#xff0c;心脏病已成为危害人类健康最常见的疾病。为了有效预防心脏疾病的发生&#xff0c;往往需要更加准确地采集与诊断心电信号&#xff0c;以便于更好地反映心脏情况。心电信号作为人体生理信号&#xff0c;对于识别心脏异常和心脏疾病具有重要的参考价值。心电信…

K8S认证|CKA题库+答案| 16. 升级集群

目录 16、升级集群 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 开始操作: 1&#xff09;、切换集群 2&#xff09;、 隔离节点 ​3&#xff09;、登录提权 ​4&#xff09;、解锁版本 ​5&#xff09;、查看版本 6&#xff09;、升级版本 7&#xff09;、其他…

Taipy快速打造数据驱动的Web应用

Taipy&#xff1a; 用Taipy&#xff0c;让数据洞察与应用开发无缝对接- 精选真开源&#xff0c;释放新价值。 概览 Taipy快速打造数据驱动的 Web 应用。这是一个基于 Python 和 Flask 的项目&#xff0c;结合了 React 等前端技术&#xff0c;为开发者提供了一个简洁、高效的开…

Python考试复习--day3

1.统计字符串个数 ninput() z0 s0 k0 o0 for i in n:if i.isalpha():zz1elif i.isnumeric():ss1elif i.isspace():k1else:o1 print(字母有{}个,数字有{}个,空格有{}个,其他字符{}个.format(z,s,k,o))2.分类统计字符 ninput() x0 d0 s0 k0 o0 for i in n:if i.islower():x1elif …

2.1 数据类型-常量-变量(整型-浮点-字符)

目录 1 数据类型 1.1 关键字 2 常量 3 变量 3.1 命名规则 4 整形数据 4.1 符号常量 4.2 整型变量 5 浮点型数据 5.1 浮点型常量 5.2 浮点型变量 6 字符型数据 6.1 字符型常量 转义字符 6.2 字符数据在内存中的存储形式及其使用方法 6.3 ASCII码表 7 字符串型常…

吉大计科软件工程个人错题

文章目录 Chapter oneChapter two——软件过程Chapter three——可行性研究Chapter four——需求分析Chapter five——总体设计Chapter six——详细设计Chapter seven——实现Chapter eight——软件维护Chapter nine——软件项目管理Chapter ten——面向对象一些不会的题一些可…

windows安装SQL Server

1、下载 下载网页&#xff1a;SQL Server 下載 | Microsoft 2022版下载地址&#xff1a;https://go.microsoft.com/fwlink/p/?linkid2215158&clcid0x404&culturezh-tw&countrytw 下载结果&#xff1a;SQL2022-SSEI-Dev.exe 打开选第三个&#xff0c;下载介质&…

二叉树——经典练习题

目录 前言&#xff1a; 一、单值二叉树 题目描述&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; 二、二叉树最大深度 题目描述&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; 三、检查两颗树是否相同 题目描述&#xff1a; 思路分析&#xff1a; 代…

AI图书推荐:ChatGPT解码—人工智能增强生活指南

《ChatGPT解码—人工智能增强生活指南》&#xff08;ChatGPT Decoded. A Beginners Guide to AI-Enhanced Living &#xff09;是一本由 大卫维恩斯&#xff08;David Wiens &#xff09;所著的书籍&#xff0c;旨在帮助读者了解并有效利用GPT-4语言模型这一强大工具来提升日常…

OceanBase SQL 诊断和调优实践——【DBA从入门到实践】第七期

数据库作为绝大多数应用系统储存数据的核心系统&#xff0c;在用户系统需要访问数据时&#xff0c;有着至关重要的作用。在这些交互中&#xff0c;SQL 语言是应用与数据库系统之间“沟通”的桥梁&#xff0c;它负责将应用的指令传达给数据库。因此&#xff0c;SQL 的性能好坏直…

网络工程师---第三十八天

ISIS&#xff1a; ISIS含义&#xff1a;中间系统到中间系统IS-IS。 ISIS特点&#xff1a;①内部网关协议IGP&#xff08;Interior Gateway Protocol&#xff09;&#xff0c;用于自治系统内部&#xff1b; ②IS-IS也是一种链路状态协议&#xff0c;使用最短路径优先SPF算法进…

Jenkins 流水线(Pipeline)详解

大家好&#xff0c;Jenkins 流水线&#xff08;Pipeline&#xff09;是一种可编排的持续集成和交付&#xff08;CI/CD&#xff09;方法&#xff0c;它以代码的方式定义整个软件开发过程中的构建、测试和部署流程。接下来就跟大家分享一下Jenkins 流水线&#xff08;Pipeline&am…

云计算-基础设施和管理机制(Infrastructure and Management Mechanisms)

逻辑网络边界&#xff08;Logical Network Perimeter&#xff09; 逻辑网络边界是软件控制的虚拟网络&#xff0c;它是物理网络的一部分。其主要思想是隔离逻辑网络&#xff0c;防止不希望的访问&#xff0c;同时仍然为合法用户提供访问权限。下图显示了云系统中一个简单的逻辑…

【Qt】Qt入门

思维导图 学习目标 这一系列是学习Qt&#xff0c;在C中&#xff0c;会发现有不少岗位的要求是熟悉Qt&#xff0c;所以Qt的学习是不能推迟的。 一、Qt的概述 1.1 Qt的特点 Qt是一个跨平台的C应用程序开发框架&#xff1a; 具有短平快的优秀特质&#xff1a;投资少&#xff0…

每日练习——同余方程以及格雷码

同余方程 题目描述 运行代码 #include<iostream> #define ll long long using namespace std; ll exgcd(ll a, ll b, ll& x, ll& y) {if (!b)return x 1, y 0, a;ll d exgcd(b, a % b, y, x);y - a / b * x;return d; } int main() {ll a, b, x, y;cin >…

【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)

背景需求&#xff1a; 【教学类-58-04】黑白三角拼图04&#xff08;2-10宫格&#xff0c;每个宫格随机1张-6张&#xff0c;带空格纸&#xff0c;1页6张黑白&#xff0c;1张6张白卡&#xff09;-CSDN博客文章浏览阅读582次&#xff0c;点赞16次&#xff0c;收藏3次。【教学类-58…

Kafka 安装教程和基本操作

一、简介 Kafka 是最初由 Linkedin 公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于 zookeeper 协调的分布式日志系统&#xff08;也可以当做 MQ 系统&#xff09;&#xff0c;常见可以用于 web/nginx 日志、访问日志&#xff0c;消息服务等等…

C++之lambda函数与std::bind区别及用法实例(二百八十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

AI网络爬虫-从当当网批量获取图书信息

工作任务和目标&#xff1a;用户输入一个图书名称&#xff0c;然后程序自动从当当网批量获取图书信息 查看相关元素在源代码中的位置&#xff1a; 第一步&#xff1a;在deepseek中输入提示词&#xff1a; 你是一个Python爬虫专家&#xff0c;一步步的思考&#xff0c;完成以下…