C数据结构与算法——二叉树 应用一

news2024/12/23 19:49:34

实验任务

(1) 掌握二叉树的二叉链表存储结构定义;
(2) 掌握该存储方式下的二叉树基本算法;
(3) 掌握三种遍历的递归算法。

实验内容

  1. 实现二叉链表存储结构及其基本算法
  2. 算法简单应用
    • 创建一颗二叉树的二叉链表
    • 输出该二叉树的三种遍历序列(前、中、后序 遍历)

实验源码

#include <stdio.h>
#include <malloc.h>

typedef struct BiTNode {
    char data;
    struct BiTNode *lChild, *rChild;
} BiTNode, *BiTree;


void InitBiTree(BiTree *tree);

void CreateBiTree(BiTree *tree);

BiTree InsertLeftNode(BiTree tree, char data);

BiTree InsertRightNode(BiTree tree, char data);

void PreOrderTraverse(BiTree tree);

void InOrderTraverse(BiTree tree);

void PostOrderTraverse(BiTree tree);

void VisitNode(BiTree tree);


/**
 * <h2>二叉树实验一</h2>
 * <h3>左右插入结点法</h3>
 * @return 0
 */
int main() {

    // 定义一棵二叉树
    BiTree tree;

    // 初始化
    InitBiTree(&tree);

    // 创建二叉树
    CreateBiTree(&tree);

    // 前序遍历
    printf("前序遍历:");
    PreOrderTraverse(tree);
    printf("\n");

    // 中序遍历
    printf("中序遍历:");
    InOrderTraverse(tree);
    printf("\n");

    // 后序遍历
    printf("后序遍历:");
    PostOrderTraverse(tree);
    printf("\n");

    return 0;
}

void InitBiTree(BiTree *tree) {
    *tree = NULL;
}

void CreateBiTree(BiTree *tree) {
    *tree = InsertLeftNode(*tree, 'A');
    *tree = InsertLeftNode(*tree, 'B');
    *tree = InsertLeftNode(*tree, 'E');
    (*tree)->lChild->lChild = InsertRightNode((*tree)->lChild->lChild, 'F');
    (*tree)->lChild = InsertRightNode((*tree)->lChild, 'C');
    (*tree)->lChild = InsertRightNode((*tree)->lChild, 'D');
    (*tree)->lChild->rChild->rChild = InsertLeftNode((*tree)->lChild->rChild->rChild, 'G');
}

// 左插入
BiTree InsertLeftNode(BiTree tree, char data) {
    if (tree != NULL) {
        // 遍历左孩子
        tree->lChild = InsertLeftNode(tree->lChild, data);
    } else {
        // 插入结点到左孩子
        tree = (BiTree) malloc(sizeof(BiTNode));
        if (tree == NULL) {
            return NULL;
        }
        tree->data = data;
        tree->lChild = tree->rChild = NULL;
    }
    return tree;
}

// 右插入
BiTree InsertRightNode(BiTree tree, char data) {
    if (tree != NULL) {
        // 遍历右孩子
        tree->rChild = InsertRightNode(tree->rChild, data);
    } else {
        // 插入结点到右孩子
        tree = (BiTree) malloc(sizeof(BiTNode));
        if (tree == NULL) {
            return NULL;
        }
        tree->data = data;
        tree->lChild = tree->rChild = NULL;
    }
    return tree;
}

void PreOrderTraverse(BiTree tree) {
    if (tree != NULL) {
        VisitNode(tree); // 前序
        PreOrderTraverse(tree->lChild);
        PreOrderTraverse(tree->rChild);
    }
}

void InOrderTraverse(BiTree tree) {
    if (tree != NULL) {
        InOrderTraverse(tree->lChild);
        VisitNode(tree); // 中序
        InOrderTraverse(tree->rChild);
    }
}

void PostOrderTraverse(BiTree tree) {
    if (tree != NULL) {
        PostOrderTraverse(tree->lChild);
        PostOrderTraverse(tree->rChild);
        VisitNode(tree); // 后序
    }
}

void VisitNode(BiTree tree) {
    printf("%c ", tree->data);
}

实验结果

在这里插入图片描述

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

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

相关文章

redis的事务和watch机制

这里写目录标题 第一章、redis事务和watch机制1.1&#xff09;redis事务&#xff0c;事务的三大命令语法&#xff1a;开启事务 multi语法&#xff1a;执行事务 exec语法&#xff1a;取消事务 discard 1.2&#xff09;redis事务的错误和回滚的情况1.3&#xff09;watch机制语法&…

NodeJS 个性化音乐推荐系统 毕业设-附源码00485

摘要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作规…

在excel调用SAP函数执行SAP数据查找或提交

1、下载插件 2、安装插件 3、执行函数 3.1 第一步 通过SAPRegister连接SAP服务器 var reg SAPRegister("10.10.14.15", "00", "mes", "AQ123456", "800") 需要改为实际的连接信息 "10.10.14.15" 为SAP服务器I…

【如何构建自己的基于Arduino的Scara 机器人】

【如何构建自己的基于Arduino的Scara 机器人】 1. 概述2. Scara机器人3D模型3. 3D打印机器人零件4. 组装机器人5. SCARA机器人电路图6. 完成装配7. SCARA机器人的工作原理8. 对 SCARA 机器人进行编程 – Arduino 和处理代码9. 总结在本教程中,我们将学习如何构建基于 Arduino …

Linux下C语言调用libcurl库下载文件到本地

一、项目介绍 当前文章介绍如何使用C语言调用libcurl库在Linux&#xff08;Ubuntu&#xff09;操作系统下实现网络文件下载功能。 libcurl是一个开源的跨平台网络传输库&#xff0c;用于在C和C等编程语言中实现各种网络通信协议的客户端功能。它支持多种协议&#xff0c;包括…

监测冷却塔面临的挑战和解决方案

工业冷却塔是现代生产过程中不可或缺的一部分&#xff0c;其稳定高效的运行对于许多工业流程至关重要。然而&#xff0c;冷却塔的监测任务并非易事&#xff0c;因为它们既有许多与其他旋转设备相似的特征&#xff0c;又面临一系列独特的挑战。在本文中&#xff0c;我们将探讨监…

在qemu中挂载镜像文件

将镜像文件作为交换分区 创建镜像文件&#xff1a; dd if/dev/zero ofswap.img bs512 count131072 qemu-system-arm -nographic -M vexpress-a9 -m 64M -kernel arch/arm/boot/zImage -append "rdinit/linuxrc consolettyAMA0 loglevel8" -dtb arch/arm/boot/dts/…

使用Automatic1111在本地PC上运行SDXL 1.0

这是我们部署Stable Diffusion的第三篇文章了&#xff0c;前两篇文章都详细介绍了Automatic1111的stable-diffusion-webui的安装&#xff0c;这次主要介绍如何使用SDXL 1.0模型。 获取项目 在本地获取Automatic1111’s WebUI项目&#xff0c;下载完成后应该是这个样子的 下载检…

【Redis】使用Docker镜像配置集群时的Operation timed out问题

不知道有没有小伙伴跟我一样是使用的Docker镜像进行Redis集群案例模拟的&#xff08;三台虚拟机确实带不动 &#xff09;&#xff0c;然后我遇到了一个问题&#xff1a;Could not connect to Redis at 172.17.0.2:6379: Operation timed out 172.17.0.2是我其中一个Redis实例的…

解决域控转移5个角色后关掉原主域控无法使用

最近域控win2016要升级到win2022&#xff0c;每次都是角色转移了&#xff0c;但是原先域控断网后&#xff0c;新角色域控无法单独运行&#xff0c;会提示找不到域服务器之类的 //转移5大角色 //需要在powershell执行 Move-ADDirectoryServerOperationMasterRole -Identity 你的…

Electron+vue3项目使用SQLite3数据库

SQLite 是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;我们不需要在系统中配置。 就像其他数据库&#xff0c;SQLite 引擎不是一个独立的进程&am…

C#,数值计算——多维下坡单纯形法(Downhill Simplex Method in Multidimensions)的计算方法与源程序

using System; namespace Legalsoft.Truffer { /// <summary> /// 多维下坡单纯形法 /// Downhill Simplex Method in Multidimensions /// </summary> public class Amoeba { private int nfunc { get; set; } private …

代理模式及常见的3种代理类型对比

代理模式及常见的3种代理类型对比 代理模式代理模式分类静态代理JDK动态代理CGLIBFastclass机制 三种代理方式之间对比常见问题 代理模式 代理模式是一种设计模式&#xff0c;提供了对目标对象额外的访问方式&#xff0c;即通过代理对象访问目标对象&#xff0c;这样可以在不修…

kubernetes 集群命令行工具 kubectl

1、kubectl 概述 kubectl是一种命令行工具&#xff0c;用于管理Kubernetes集群和与其相关的资源。通过kubectl&#xff0c;您可以查看和管理Pod、Deployment、Service、Volume、ConfigMap等资源&#xff0c;也可以创建、删除和更新它们。 kubectl还提供了许多其他功能&#x…

那些你不知道的类和对象的知识

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

vscode运行python报错:ModuleNotFoundError:No module named ‘xxx‘

在乌班图上使用pycharm的时候&#xff0c;pycharm总是莫名其妙卡死&#xff0c;又说是搜狗输入法的锅&#xff0c;又说别的原因&#xff0c;一气之下不用pycharm,转到vscode上&#xff0c;没想到出现了如下报错。 就是vscode在运行python的时候&#xff0c;自定义模块的调用无…

springboot配置文件的使用

目录 1.application.properties是springboot默认的配置文件&#xff0c;但是比较繁琐&#xff0c;一般用.yml文件 2. 配置文件的作用 3.配置文件的使用 1.application.properties是springboot默认的配置文件&#xff0c;但是比较繁琐&#xff0c;一般用.yml文件 ①、properti…

【设计模式】模板模式

什么是模板模式&#xff1f; 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式(Template Pattern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行…

LeetCode--HOT100题(25)

目录 题目描述&#xff1a;141. 环形链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;141. 环形链表&#xff08;简单&#xff09; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连…

SpringBoot集成极光推送完整实现代码(建议收藏)

工作中经常会遇到服务器向App推送消息的需求&#xff0c;一般企业中选择用极光推送的比较多&#xff0c;在集成极光时发现极光的文档并不完整&#xff0c;网上的文章也很多不能直接使用&#xff0c;这里列出我在工作中集成极光的全部代码&#xff0c;只需要按照如下代码保证一次…