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

news2024/11/27 0:06:31

目录

前言

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.coloradmin.cn/o/1671290.html

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

相关文章

MySQL_DDL语句

1.Data类临时数据的弊端 我们之前在将ServletJSP配合处理请求的过程中 数据库起到一个存取数据的作用 但是我们之前的案例中 数据是在Data类中临时定义的 并不是从数据库中获取的 这样做是不好的 因为每一次服务器关闭之后 那么部署在其上的类也会随着卸载 紧接着和类相挂钩的静…

DS高阶:B树系列

一、常见的搜索结构 1、顺序查找 时间复杂度&#xff1a;O(N) 2、二分查找 时间复杂度&#xff1a;O(logN) 要求&#xff1a;&#xff08;1&#xff09;有序 &#xff08;2&#xff09;支持下标的随机访问 3、二叉搜索树&#xff08;BS树&#xff09; 时间复杂…

通俗易通解读Restaking,潜力如何?(bitget钱包玩转)

关于 Restaking 再质押&#xff1a; 1. Restaking 在功能上&#xff0c;将以太坊安全性标准化&#xff0c;并将其“货币化”&#xff0c;Restaking 出售的就是以太坊的安全性&#xff0c;同时&#xff0c;将安全性用质押后的通证数量直观表现出来 2. Restaking 在经济机制上的逐…

NSSCTF | [第五空间 2021]WebFTP

注意看这里的题目标签&#xff0c;目录扫描&#xff0c;.git泄露。那么这道题虽然打开是一个登录的界面&#xff0c;但是并不是我们熟悉的爆破和SQL注入。 但是可以在题目标签上看到目录扫描&#xff0c;我们就用dirsearch扫一扫看看 python dirsearch.py -u http://node4.ann…

下载wsl 网络出现问题,解决办法

查看能下载的wsl系统时&#xff0c;显示网络出现问题 解决办法&#xff1a;更换网络节点 最终效果&#xff1a;

学习java

在实验室看见这本书&#xff0c;无聊看了下&#xff0c;写出了第一个java代码 成功下载了eclipse并且汉化。 写了自己的第一个java程序&#xff1a; package ttttt;public class ttttt {public static void main(String[] args) {System.out.println("hello world")…

模型 洋葱模型(组织管理方向)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。层层深入&#xff0c;探索核心。 1 洋葱模型的应用 1.1 洋葱模型用于职业规划 有一个名叫李明的大学生&#xff0c;他最近感到迷茫和压力&#xff0c;因为他即将毕业并面临职业选择。李明决定寻求心…

从零开始详解OpenCV车道线检测

前言 车道线检测是智能驾驶和智能交通系统中的重要组成部分&#xff0c;对于提高道路安全、交通效率和驾驶舒适性具有重要意义。在本篇文章中将介绍使用OpenCV进行车道线的检测 详解 导入包 import cv2 import matplotlib.pyplot as plt import numpy as np读入图像并灰度化…

用matplotlib制作代码和色块

代码如下&#xff1a; # 声明 # -*- coding: utf-8 -*- """ Created on Mon May 13 11:18:59 2024author: sankang """ # 这里调用包 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as npplt.rcParams[axes.unicode_…

ASP.NET仪器设备管理系统设计与实现

摘 要 文中以某中小型企业的设备管理为例&#xff0c;对设备管理系统的设计与应用进行研究&#xff0c;旨在通过设备管理系统提高内部设备的利用率及实现其最大的经济效益。文中首先对设备管理的现状及其重要性进行了分析&#xff0c;分析实现设备管理信息系统的必要性与可行…

1.基本概念,半导体基础

1.电压降&#xff1a; 指电流通过阻抗负载时的电位降的大小。&#xff08;线段或部件两端的电压&#xff09;。 2.数量较多的载流子称为多子 3.二极管和稳压管 4.习题

银发经济背后百万亿市场,解析冷门暴利的中老年AI赚钱项目!

最近“银发经济”这个词频繁出现&#xff0c;如果你注意到了抖音被封号的“秀才”以及仍在活跃的“一笑倾城”这两个账号&#xff0c;你就会明白中老年赛道的前景是多么广阔。 《银发经济蓝皮书》数据显示&#xff0c;到目前为止&#xff0c;我国60岁及以上的老年人口已超过2.8…

2024最佳项目管理软件整理

在项目管理领域&#xff0c;选择合适的任务管理软件对于提高团队效率和确保项目顺利进行至关重要。 以下是一些优秀的项目任务管理软件&#xff0c;以及它们的官网地址和特点介绍 序号软件名称官网地址特点介绍1zz-planhttps://zz-plan.com/一款在线甘特图协作软件&#xff0c…

炫酷渐变官网源码

炫酷渐变官网源码 效果图部分代码领取源码下期更新预报 效果图 部分代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title…

下载驱动包提示 通常不会下载 未验证的下载

打开设置 添加允许站点 如果还是下载不了&#xff0c;那只能换资源了

基于网络的无人海洋船舶控制

书籍&#xff1a;Network-Based Control of Unmanned Marine Vehicles 作者&#xff1a;Yu-Long Wang&#xff0c;Qing-Long Han&#xff0c;Chen Peng&#xff0c;Lang Ma 出版&#xff1a;Springer 书籍下载-《基于网络的无人海洋船舶控制》控制系统中的通信网络可能引起延…

9.多数元素

文章目录 题目简介题目解答解法一&#xff1a;排序代码&#xff1a;复杂度分析&#xff1a; 解法二&#xff1a;摩尔投票法代码&#xff1a;复杂度分析&#xff1a; 解法三&#xff1a;哈希表代码复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来…

Meilisearch vs Elasticsearch

2个搜索引擎的比较&#xff08;官方说法&#xff09;&#xff1a;Meilisearch vs Elasticsearch Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需…

《intel开发手册卷3》读书笔记1

1、CPU工作模式 1&#xff09;实模式&#xff1a;8086的寄存器只有16位&#xff0c;我们也习惯于称8086的工作模式为16位模式。后续的CPU为了保持兼容性&#xff0c;在芯片上了电以后&#xff0c;还必须运行于16位模式之下。这种模式还有个正式的名字叫做实模式。在实模式下&am…

转移插槽笔记

4.3.4.转移插槽 我们要将num存储到7004节点&#xff0c;因此需要先看看num的插槽是多少&#xff1a; 如上图所示&#xff0c;num的插槽为2765. 我们可以将0~3000的插槽从7001转移到7004&#xff0c;命令格式如下&#xff1a; 具体命令如下&#xff1a; 建立连接&#xff1a;…