[数据结构]:07-二叉树(无头结点)(C语言实现)

news2025/1/16 4:46:00

目录

前言

已完成内容

二叉树实现

01-开发环境

02-文件布局

03-代码

01-主函数

02-头文件

03-QueueFunction.cpp

04-TreeFunction.cpp

结语


前言

        此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。

已完成内容

[数据结构]:01-顺序表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:02-单链表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:03-栈(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:04-循环队列(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:05-循环队列(链表)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:06-队列(链表带头结点)(C语言实现)_Chandni.的博客-CSDN博客

二叉树实现

01-开发环境

        语言:C/C++14

        编译器:MinGW64

        集成开发环境:CLion2022.1.3

02-文件布局

        请在CLion集成开发环境中创建C++可执行程序,否则无法运行,原因上面已解释。

                        

 

03-代码

01-主函数

        用于测试和初始化二叉树。

#include "./Head/TreeData.h"
#include "./Source/QueueFunction.cpp"
#include "./Source/TreeFunction.cpp"

int main() {
    // 层序创建树
    BinaryTree BTree = NULL;
    int value[MaxSize] = {1, 2, 3, 4, 5, 6, 0};
    TreeCreate(BTree, value);

    // 前序遍历
    // 1  2  4  5  3  6
    printf("Preorder.\n");
    PreorderTraversalTree(BTree);
    printf("\n");

    // 中序遍历
    // 4  2  5  1  6  3
    printf("InOrder.\n");
    InOrderTraversalTree(BTree);
    printf("\n");

    // 后序遍历
    // 4  5  2  6  3  1
    printf("PostOrder.\n");
    PostOrderTraversalTree(BTree);
    printf("\n");

    // 层序遍历
    // 1  2  3  4  5  6
    printf("Level.\n");
    LevelTraversalTree(BTree);
    printf("\n");
    return 0;
}

02-头文件

        用于存储结构体和常量等。

//
// Created by 24955 on 2023-02-26.
//

#ifndef INC_01_ARRAYQUEUE_QUEUEDATA_H
#define INC_01_ARRAYQUEUE_QUEUEDATA_H
// 头文件
#include <stdio.h>
#include <stdlib.h>

// 常量
#define MaxSize 10
typedef int ElemType;

// 结构体
// 二叉树
typedef struct BinaryTreeNode {
    ElemType data;
    struct BinaryTreeNode *lChild;
    struct BinaryTreeNode *rChild;
} BinaryTreeNode, *BinaryTree;

// 辅助队列
typedef struct SecondaryQueueNode {
    BinaryTree BTree;
    struct SecondaryQueueNode *next;
} SecondaryQueueNode;
typedef struct {
    SecondaryQueueNode *front, *rear;
} SecondaryQueue;
#endif //INC_01_ARRAYQUEUE_QUEUEDATA_H

03-QueueFunction.cpp

        用于存储辅助队列的函数。

//
// Created by 24955 on 2023-02-26.
// 队列带头结点
//
// 初始化队列(循环队列)
void InitializationQueue(SecondaryQueue &Queue) {
    Queue.front = Queue.rear = (SecondaryQueueNode *) malloc(sizeof(SecondaryQueueNode));
    Queue.rear->next = Queue.front;
}

// 判断队列是否为空
bool JudgeQueueEmpty(SecondaryQueue Queue) {
    if (Queue.front == Queue.rear) {
        return true;
    } else {
        return false;
    }
}

// 判断队列是否已满
bool JudgeQueueFull(SecondaryQueue Queue) {
    if (Queue.rear->next == Queue.front) {
        return true;
    } else {
        return false;
    }
}

// 入队
void QueuePush(SecondaryQueue &Queue, BinaryTree BTree) {
    if (JudgeQueueFull(Queue)) {
        SecondaryQueueNode *NewNode = (SecondaryQueueNode *) malloc(sizeof(SecondaryQueueNode));
        NewNode->BTree = BTree;
        NewNode->next = Queue.front;
        Queue.rear->next = NewNode;
        Queue.rear = NewNode;
    } else {
        Queue.rear->next->BTree = BTree;
        Queue.rear = Queue.rear->next;
    }
}

// 出队
void QueuePop(SecondaryQueue &Queue, BinaryTree &BTree) {
    if (!JudgeQueueEmpty(Queue)) {
        SecondaryQueueNode *Node = Queue.front->next;
        BTree = Node->BTree;
        Queue.front = Node;
    } else {
        printf("Queue Empty.\n");
    }
}

04-TreeFunction.cpp

        用于存储树的创建、遍历等函数。

//
// Created by 24955 on 2023-02-27.
// 不带头结点(408不存在带头结点的树)
//
// 创建树-层序创建
void TreeCreate(BinaryTree &BTree, int value[]) {
    /*
     * 1. 初始化辅助队列
     * 2. 初始化要插入的树节点
     * 3. 判断是否为根节点
     * 4. 若非根节点,则判断左孩子是否为空,为空则插入,并修改辅助队列尾指针
     * 5. 否则判断右孩子是否为空,为空则插入,并修改辅助队列头、尾指针*/
    // 初始化辅助队列
    SecondaryQueue Queue;
    InitializationQueue(Queue);
    // 树的新结点
    BinaryTree NewBTree;
    for (int i = 0; value[i]; i++) {
        // 初始化树结点
        // calloc申请空间大小为两参数相乘
        // 并对空间初始化赋值为0
        // NewBTree->lChild = NULL;NewBTree->rChild = NULL;可省略
        NewBTree = (BinaryTree) calloc(1, sizeof(BinaryTreeNode));
        NewBTree->data = value[i];

        // 判断是否为创建根节点
        if (BTree == NULL) {
            // 创建根节点
            BTree = NewBTree;
            // 入队(辅助队列)
            QueuePush(Queue, NewBTree);
        } else {
            // 创建非根节点
            SecondaryQueueNode *FirstQueueNode = Queue.front->next;
            BinaryTree NowTree = FirstQueueNode->BTree;

            // 插入
            if (NowTree->lChild == NULL) {
                // 插入左孩子
                NowTree->lChild = NewBTree;
                // 入队(辅助队列)
                QueuePush(Queue, NewBTree);
            } else if (NowTree->rChild == NULL) {
                // 插入右孩子
                NowTree->rChild = NewBTree;
                // 入队(辅助队列)
                QueuePush(Queue, NewBTree);
                // 出队(辅助队列)
                BinaryTree OutTree;
                QueuePop(Queue, OutTree);
            }
        }
    }
}

// 前序遍历(深度优先遍历)
void PreorderTraversalTree(BinaryTree BTree) {
    /* 递归三要素:目标、结束条件、等价关系式
     * 1. 自身、左、右*/
    if (BTree != NULL) {
        printf("%3d", BTree->data);
        PreorderTraversalTree(BTree->lChild);
        PreorderTraversalTree(BTree->rChild);
    }
}

// 中序遍历
void InOrderTraversalTree(BinaryTree BTree) {
    /*
     * 1. 左、自身、右*/
    if (BTree != NULL) {
        InOrderTraversalTree(BTree->lChild);
        printf("%3d", BTree->data);
        InOrderTraversalTree(BTree->rChild);
    }
}

// 后序遍历
void PostOrderTraversalTree(BinaryTree BTree) {
    /*
     * 1. 左、右、自身*/
    if (BTree != NULL) {
        PostOrderTraversalTree(BTree->lChild);
        PostOrderTraversalTree(BTree->rChild);
        printf("%3d", BTree->data);
    }
}

// 层序遍历(广度优先遍历)
void LevelTraversalTree(BinaryTree BTree) {
    /*
     * 1. 将树根节点入队
     * 2. 判断队列是否为空
     * 3. 若不为空,出队并输出
     * 4. 判断左、右孩子是否为空,不为空则入队*/
    // 初始化辅助队列
    SecondaryQueue SQueue;
    InitializationQueue(SQueue);

    // 树根节点入队
    QueuePush(SQueue, BTree);
    BinaryTree NowTreeNode;
    while (!JudgeQueueEmpty(SQueue)) {
        // 出队并打印
        QueuePop(SQueue, NowTreeNode);
        printf("%3d", NowTreeNode->data);
        // 判断左、右孩子是否为空,非空入队
        if (NowTreeNode->lChild != NULL) {
            QueuePush(SQueue, NowTreeNode->lChild);
        }
        if (NowTreeNode->rChild != NULL) {
            QueuePush(SQueue, NowTreeNode->rChild);
        }
    }
}

结语

        此博客主要用于408考研数据结构C语言实现记录,内有不足,可留言,可讨论。

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

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

相关文章

金三银四,助力你的大厂梦,2023年软件测试经典面试真题(3)(共3篇)

前言 金三银四即将到来&#xff0c;相信很多小伙伴要面临面试&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大…

【软件测试】从0到1的突破,appium自动化测试你真的会吗?自动化测试思路总结......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 总结一下APP UI自动…

超店有数分享:tiktok数据分析工具推荐,助你成功出海!

现阶段的跨境电商人都纷纷入局tiktok&#xff0c;这是风口也是发展趋势。Tiktok的下载量已经超过了35亿&#xff0c;每月都有10亿用户活跃&#xff0c;在154国家/地区使用。Tiktok用户每天在平均花1小时左右进行浏览&#xff0c;打开率也很高。如今&#xff0c;tiktok也越来越成…

酷雷曼VR丨十大“高含金量”荣誉,一起见证!

VR全景领域 十大“高含金量”荣誉 高光时刻 一同见证 01、双高新技术企业 同时获得国家高新技术企业、中关村高新技术企业双认证&#xff0c;是对酷雷曼企业研究开发组织管理水平、科技成果转化能力、自主知识产权数量、销售与总资产成长性等多维度实力的综合体现。 双高…

【MinIO】文件断点续传和分块合并

【MinIO】文件断点续传和分块合并 文章目录【MinIO】文件断点续传和分块合并0. 准备工作1. 检查文件是否存在1.1 定义接口1.2 编写实现方法2. 检查分块文件是否存在2.1 定义接口2.2 编写实现方法3. 上传分块文件接口3.1 定义接口3.2 编写实现方法4. 合并分块文件接口4.1 定义接…

如何判断一个客户是大客户?

米茂搜对主要外贸销售客户的识别方法整理如下&#xff1a;1. 确定研究目标。通过对客户数据的收集和分析&#xff0c;找出大客户&#xff0c;对大客户实施个性化管理&#xff0c;并对其服务进行跟踪&#xff0c;以及。不时地改善服务&#xff0c;以保持他们的忠诚度。2. 扩大信…

ChatGPT 引爆全网热议,如果当它是“聊天机器人”,那你可就错了

近日来&#xff0c;智能聊天机器人ChatGPT的出现引发众多网友讨论&#xff0c;那它到底是什么呢&#xff1f; 2022年11月&#xff0c;人工智能公司OpenAI推出了一款聊天机器人&#xff1a;ChatGPT。它能够通过学习和理解人类语言来进行对话&#xff0c;还能与聊天对象进行有逻…

骨传导耳机对骨头有影响吗?骨传导耳机好不好

首先很明确的告诉你&#xff0c;骨传导耳机对骨头是没有影响的&#xff0c;骨传导耳机反倒可以起到保护听力的作用。 骨传导是一种声音传导方式&#xff0c;即将声音转化为不同频率的机械振动&#xff0c;通过人的颅骨、骨迷路、内耳淋巴液传递&#xff0c;螺旋器、听神经、听觉…

【转载】bootstrap自定义样式-bootstrap侧边导航栏的实现

bootstrap自带的响应式导航栏是向下滑动的&#xff0c;但是有时满足不了个性化的需求: 侧滑栏使用定位fixed 使用bootstrap响应式使用工具类 visible-sm visible-xs hidden-xs hidden-sm等对不同屏幕适配 侧滑栏的侧滑效果不使用jquery方法来实现&#xff0c;使用的是css3 tr…

02-27 周一 图解机器学习SVM-人脸识别之PCA降维

02-27 周一 图解机器学习SVM分类时间版本修改人描述2023年2月27日09:48:38V0.1宋全恒新建文档 简介 本文主要是在试图代码分析图解机器学习这本书中5.5人脸识别分类&#xff08;p60&#xff09;&#xff0c;主要的过程是使用PCA技术和SVM技术进行人脸的分类工作。 准备 数据集…

JavaScript中单例模式这样用

如果希望自己的代码更优雅、可维护性更高以及更简洁&#xff0c;往往离不开设计模式这一解决方案。 在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化&#xff08;将变与不变分离&#xff0c;确保变化的部分灵活&#xff0c;不变的部分稳定&#xff09;。 单例模式…

Spring Batch 综合案例实战中

目录 需求一 需求二 转视频版 需求一 需求&#xff1a;先动态生成50w条员工数据&#xff0c;存放再employee.csv文件中 步骤1&#xff1a;定义&#xff1a;DataInitController RestController public class DataInitController {Autowiredprivate IEmployeeService emplo…

arduino-sentry2之卡片篇

欧克,今天在学生的强烈要求下 我又重启arduino的sentry2调试篇 目前实验结果,可以检测到10张交通卡片 也就是如图所示十张 具体视频如下: https://live.csdn.net/v/279170 具体代码如下: #include <Arduino.h> #include <

什么是千年虫?计算机如何开始处理日期?都有哪些时间日期格式化?

目录 “千年虫”漏洞&#xff08;Year 2000 Problem&#xff0c;简称“Y2K”&#xff09; 计算机是怎么开始处理日期的么&#xff1f; 举例1&#xff1a;时间格式化举例( 过滤器) 举例2&#xff1a;时间格式化 自定义私有过滤器(日期格式化) 高性能计数器演示 OLE时间对象…

Vue的组件(注册、局部、组件复用、props、emit、生命周期)全解

文章目录前言知识点组件注册局部组件组件复用组件间通信props 类型检测子父组件通信之 emit动态组件生命周期函数前言 Vue 支持模块化和组件化开发&#xff0c;可以将整个页面进行模块化分割&#xff0c;低耦合高内聚&#xff0c;使得代码可以在各个地方使用。 知识点 组件注册…

python自学之《21天学通Python》(15)——第18章 数据结构基础

数据结构是用来描述一种或多种数据元素之间的特定关系&#xff0c;算法是程序设计中对数据操作的描述&#xff0c;数据结构和算法组成了程序。对于简单的任务&#xff0c;只要使用编程语言提供的基本数据类型就足够了。而对于较复杂的任务&#xff0c;就需要使用比基本的数据类…

华三OSPF 综合实验

OSPF 实验 实验拓扑 实验需求 按照图示配置 IP 地址按照图示分区域配置 OSPF &#xff0c;实现全网互通为了路由结构稳定&#xff0c;要求路由器使用环回口作为 Router-id&#xff0c;ABR 的环回口宣告进骨干区域 实验解法 1.配置 IP 地址部分 2.按照图示分区域配置 OS…

FFmpeg从入门到入魔(1):初探FFmpeg框架

1. FFmpeg介绍与裁剪1.1 FFmpeg简介FFmpeg&#xff08;Fast forword mpeg&#xff0c;音视频转换器&#xff09;是一个开源免费跨平台的视频和音频流方案&#xff0c;它提供了录制/音视频编解码、转换以及流化音视频的完整解决方案。ffmpeg4.0.2源码目录结构如下&#xff1a;目…

为什么IBDP的文凭更受美国大学的青睐?

家长们可以看到&#xff0c;不管是AP还是A-LEVEL这样的课程&#xff0c;都只是单科的课程&#xff08;A-LEVEL也是英国发展出来&#xff0c;AP是针对美国大学设计的&#xff09;&#xff0c;学生是可以针对他们的强项去做选修&#xff0c;比如我的化学很强&#xff0c;那我可以…

第十节 集合

集合 什么是集合 集合就是能储存一批元素的容器。 特征&#xff1a; 集合类型可以不固定&#xff0c;大小也是可变的。 ArrayList集合 ArrayList是集合中的一种&#xff0c;它支持索引。 ArrayList集合的对象获取 public ArrayList()创建一个空的集合对象 ArrayList集合的添加…