数据结构与算法学习笔记九-二叉树的链式存储表示法和实现(C语言)

目录

前言

1.二叉树的链式存储

2.二叉链表的表示和实现

1.定义

2.创建

4.中序遍历二叉树

5.后序遍历二叉树

6.后序遍历二叉树

7.完整代码


前言

    这篇博客主要介绍二叉树的链式存储结构。

1.二叉树的链式存储

       上篇文章中介绍了二叉树的顺序存储结构,在最坏的情况下,比如二叉树仅有左子树或者右子树的时候,我们仍然需要为不存在的节点分配大量的存储空间,这无疑会造成存储空间的浪费。考虑到二叉树的三要素:数据域、右子树指针、左子树指针,我们可以考虑使用链式存储来表示二叉树。

        当我们使用数据域、左右子树指针表示二叉树的结构时,得到的二叉树链表成为二叉链表。我们还可以再二叉链表的基础上增加一个父结点的数据域,这样得到的二叉树链表称为三叉链表。

        二叉链表和三叉链表的存储结构如下图所示:

                        图1.二叉链表和三叉链表的表示                

2.二叉链表的表示和实现

1.定义

typedef char TelemType;
typedef int Status;
typedef struct BiTNode{TelemType data;//数据域struct BiTNode * lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;

2.创建

// 创建二叉树
Status createBiTree(BiTree *tree) {TelemType data;scanf("%c", &data); // 读取节点数据if (data == '#') {*tree = NULL; // 空节点} else {*tree = (BiTNode *)malloc(sizeof(BiTNode));if (!*tree) {exit(EXIT_FAILURE); // 内存分配失败return 0;}(*tree)->data = data; // 存储节点数据createBiTree(&((*tree)->lchild)); // 递归创建左子树createBiTree(&((*tree)->rchild)); // 递归创建右子树}return 1; // 创建成功
}

3.先序遍历二叉树

// 先序遍历二叉树
Status preOrderTraverse(BiTree tree) {if (tree == NULL) {return 1; // 空树,遍历结束}// 访问根节点printf("%c ", tree->data);// 递归遍历左子树preOrderTraverse(tree->lchild);// 递归遍历右子树preOrderTraverse(tree->rchild);return 1; // 遍历成功
}

4.中序遍历二叉树

// 中序遍历二叉树
Status inOrderTraverse(BiTree tree) {if (tree == NULL) {return 1; // 空树,遍历结束}// 递归遍历左子树inOrderTraverse(tree->lchild);// 访问根节点printf("%c ", tree->data);// 递归遍历右子树inOrderTraverse(tree->rchild);return 1; // 遍历成功
}

5.后序遍历二叉树

// 后序遍历二叉树
Status postOrderTraverse(BiTree tree) {if (tree == NULL) {return 1; // 空树,遍历结束}// 递归遍历左子树postOrderTraverse(tree->lchild);// 递归遍历右子树postOrderTraverse(tree->rchild);// 访问根节点printf("%c ", tree->data);return 1; // 遍历成功
}

6.后序遍历二叉树

// 后序遍历二叉树
Status postOrderTraverse(BiTree tree) {if (tree == NULL) {return 1; // 空树,遍历结束}// 递归遍历左子树postOrderTraverse(tree->lchild);// 递归遍历右子树postOrderTraverse(tree->rchild);// 访问根节点printf("%c ", tree->data);return 1; // 遍历成功
}

7.完整代码

#include <stdio.h>
#include <stdlib.h>typedef char TelemType;
typedef int Status;
typedef struct BiTNode{TelemType data;//数据域struct BiTNode * lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;// 创建二叉树
Status createBiTree(BiTree *tree) {TelemType data;scanf("%c", &data); // 读取节点数据if (data == '#') {*tree = NULL; // 空节点} else {*tree = (BiTNode *)malloc(sizeof(BiTNode));if (!*tree) {exit(EXIT_FAILURE); // 内存分配失败return 0;}(*tree)->data = data; // 存储节点数据createBiTree(&((*tree)->lchild)); // 递归创建左子树createBiTree(&((*tree)->rchild)); // 递归创建右子树}return 1; // 创建成功
}// 先序遍历二叉树
Status preOrderTraverse(BiTree tree) {if (tree == NULL) {return 1; // 空树,遍历结束}// 访问根节点printf("%c ", tree->data);// 递归遍历左子树preOrderTraverse(tree->lchild);// 递归遍历右子树preOrderTraverse(tree->rchild);return 1; // 遍历成功
}// 中序遍历二叉树
Status inOrderTraverse(BiTree tree) {if (tree == NULL) {return 1; // 空树,遍历结束}// 递归遍历左子树inOrderTraverse(tree->lchild);// 访问根节点printf("%c ", tree->data);// 递归遍历右子树inOrderTraverse(tree->rchild);return 1; // 遍历成功
}// 后序遍历二叉树
Status postOrderTraverse(BiTree tree) {if (tree == NULL) {return 1; // 空树,遍历结束}// 递归遍历左子树postOrderTraverse(tree->lchild);// 递归遍历右子树postOrderTraverse(tree->rchild);// 访问根节点printf("%c ", tree->data);return 1; // 遍历成功
}int main(int argc, const char *argv[]) {BiTree tree;printf("请输入二叉树的前序序列(使用'#'表示空节点):\n");createBiTree(&tree);printf("二叉树创建成功!\n");printf("先序遍历二叉树..\n");preOrderTraverse(tree);printf("\n中序遍历二叉树...\n");inOrderTraverse(tree);printf("\n后序遍历二叉树...\n");postOrderTraverse(tree);printf("\n");return 0;
}

        例如我们要生成如下图所示的二叉树。控制台输入ABD##E##CF##G##

图1.测试二叉树

        控制台打印结果如下:

        OK,打印结果正确。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙内核源码分析(文件句柄篇) | 你为什么叫句柄

句柄 | handle int open(const char* pathname,int flags); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd);只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大…

WMS仓储管理系统库存分类的详细讲解

在当今日益复杂和快速变化的商业环境中&#xff0c;仓库管理成为了一个企业不可或缺的关键环节。WMS仓储管理系统解决方案凭借其自动化和信息化的优势&#xff0c;为企业带来了革命性的改变&#xff0c;特别是在库存分类方面。接下来&#xff0c;我们将深入探讨WMS仓储管理系统…

一篇文章,系统性聊聊Java注解

你好&#xff01; 这类系统性聊聊***知识点的文章&#xff0c;是希望给大家带来对某个技术的全貌认识&#xff0c;如果大家喜欢&#xff0c;后续可以陆续更新此系列 下面&#xff0c;开始今天的分享 在之前&#xff0c;我们已经分享过注解相关的三个面试题&#xff0c; 今天的…

基于SSM的文化遗产的保护与旅游开发系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的文化遗产的保护与旅游开发系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;…

Docker部署Metabase

文章目录 Docker安装MetabaseCentOS7安装Docker获取最新的 Docker 镜像启动Metabase容器在Metabase初始化时查看日志访问Metabase Metabase 的 ClickHouse 驱动程序安装环境简介删除容器创建容器下载click house驱动放入驱动重启容器将元数据库连接到 ClickHouse报错解决 Docke…

Linux 安装JDK和Idea

安装JDK 下载安装包 下载地址&#xff1a; Java Downloads | Oracle (1) 使用xshell 上传JDK到虚拟机 (2) 移动JDK 包到/opt/environment cd ~ cd /opt sudo mkdir environment # 在 /opt下创建一个environment文件夹 ls# 复制JDK包dao /opt/environment下 cd 下载 ls jd…

26 JavaScript学习:JSON和void

JSON 英文全称 JavaScript Object NotationJSON 是一种轻量级的数据交换格式。JSON是独立的语言JSON 易于理解。 JSON 实例 简单的 JSON 字符串实例: "{\"name\": \"Alice\", \"age\": 25, \"city\": \"San Francisco\&…

如何使git提交的时候忽略一些特殊文件?

认识.gitignore文件 在生成远程仓库的时候我们会看到这样一个选项&#xff1a; 这个.gitignore文件有啥用呢&#xff1f; .gotignore文件是Git版本控制系统中的一个特殊文件。用来指定哪些文件或者目录不被Git追踪或者提交到版本库中。也就意味着&#xff0c;如果我们有一些文…

网络相关笔记

IPv4地址 IPv4地址通常以“点分十进制”形式书写&#xff0c;即四个0-255之间的十进制数&#xff0c;各数之间用英文句点&#xff08;.&#xff09;分隔&#xff0c;例如&#xff1a;192.0.2.1。总共32位的地址空间可以表示大约42亿个不同的地址。 IPv4地址结构包括&#xff…

wordpress外贸建站公司歪建站新版网站上线

wordpress外贸建站公司 歪猫建站 歪猫WordPress外贸建站&#xff0c;专业从事WordPress多语言外贸小语种网站建设与外贸网站海个推广、Google SEO搜索引擎优化等服务。 https://www.waimaoyes.com/dongguan

使用Python实现DataFrame中奇数列与偶数列的位置调换

目录 一、引言 二、背景知识 三、问题描述 四、解决方案 五、案例分析与代码实现 六、技术细节与注意事项 七、扩展与应用 八、封装为函数 九、错误处理与健壮性 十、性能优化 十一、总结与展望 一、引言 在数据处理和分析中&#xff0c;数据框&#xff08;DataFra…

Springboot集成Mybatispuls操作mysql数据库-04

MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性&#xff0c;因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率&#xff0c;…

数据结构-二叉树结尾+排序

一、二叉树结尾 1、如何判断一棵树是完全二叉树。 我们可以使用层序遍历的思路&#xff0c;利用一个队列&#xff0c;去完成层序遍历&#xff0c;但是这里会有些许的不同&#xff0c;我们需要让空也进队列。如果队列里到最后只剩下空那么这棵树就是完全二叉树。具体的实现如下…

【springboot基础】如何搭建一个web项目?

正在学习springboot&#xff0c;还是小白&#xff0c;今天分享一下如何搭建一个简单的springboot的web项目&#xff0c;只要写一个类就能实现最基础的前后端交互&#xff0c;实现web版helloworld &#xff0c;哈哈&#xff0c;虽然十分简陋&#xff0c;但也希望对你理解web运作…

C++STL细节,底层实现,面试题04

文章目录 19. STL19.1. 序列容器19.1.1. vector19.1.1.1. 底层实现和特点19.1.1.2. 常用函数19.1.1.3. emplace_back() vs push_back() 19.1.2. array19.1.2.1. 底层实现和特点19.1.2.2. 常用函数 19.1.3. deque19.1.3.1. 底层实现和特点19.1.3.2. 常用函数 19.1.4 list19.1.4.…

誉天教育近期开班计划

云计算HCIE 晚班 2024/5/13 大数据直通车 周末班 2024/5/25 数通直通车 晚班 2024/5/27 云服务HCIP 周末班 2024/6/1 云计算HCIP 周未班 2024/6/1 RHCA442 晚班 2024/6/17 周末班&#xff1a;周六-周日9:00-17:00晚 班&#xff1a;周一到周五19:00-21:30注&…

搜索的未来:OpenAI 的 GPT 如何彻底改变行业

搜索的未来&#xff1a;OpenAI 的 GPT 如何彻底改变行业 概述 搜索引擎格局正处于一场革命的风口浪尖&#xff0c;而 OpenAI 的 GPT 处于这场变革的最前沿。最近出现了一种被称为“im-good-gpt-2-chatbot”的神秘聊天机器人&#xff0c;以及基于 ChatGPT 的搜索引擎的传言&am…

android zygote进程启动流程

一&#xff0c;启动入口 app_main.cpp int main(int argc, char* const argv[]) {if (!LOG_NDEBUG) {String8 argv_String;for (int i 0; i < argc; i) {argv_String.append("\"");argv_String.append(argv[i]);argv_String.append("\" ")…

Python语言基础学习(上)

目录 一、常量和表达式 二、变量和类型 2.1 认识变量 2.2 定义变量 2.3 变量类型 1、整数 int 2、浮点数&#xff08;小数&#xff09;float 3、字符串 str 4、布尔类型 2.4 类型转换 三、注释 3.1 单行注释 3.2 文档注释&#xff08;或者多行注释&#xff09; …

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff0…