数据结构第十四天(树的存储/双亲表示法)

目录

前言

概述

接口: 

源码:

测试函数:

运行结果:

往期精彩内容


前言

孩子,一定要记得你的父母啊!!!

哈哈,今天开始学习树结构中的双亲表示法,让孩子记得归家的路,记得自己的父母是谁😉😉😉

概述

树的双亲表示法是一种常用的树的存储结构,它通过使用一个数组来表示树的节点,并且每个节点都包含了其父节点的索引信息。

在双亲表示法中,树的每个节点都包含以下两个信息:

  1. 节点的数据域:用来存储节点的数据。
  2. 父节点索引:用来存储该节点的父节点在数组中的索引。

每一个节点我们可以这样表示:

其中 data 是数据域,存储结点的数据信息。而 parent 是指针域,存储该结点的双亲在数组中的下标。 

通过这种方式,我们可以方便地找到一个节点的父节点,并且能够实现树的遍历和操作。

使用双亲表示法可以有效地存储树的结构,并且可以方便地进行遍历和操作。但双亲表示法的缺点是,它不太适合表示具有大量节点的树,因为节点之间的关系需要通过数组来表示,可能会浪费一定的空间。
 

接口: 

void addNode(char* data, char* parent);
void getParent(char* dest, char* child);
bool bTrueIfEmptyTree();
bool bTrueIfFullFilledTree();

源码:

#include<string.h>
#include<stdio.h>
#include <malloc.h>
class TREE{
private:struct PARENTSTRUCT{char data[15];struct PARENTSTRUCT* parent;};struct  PARENTSTRUCT* index[15];unsigned int currentSite = 0;struct  PARENTSTRUCT* findParent(char* child);	public:void addNode(char* data, char* parent);
void getParent(char* dest, char* child);
bool bTrueIfEmptyTree();
bool bTrueIfFullFilledTree();
};
struct  TREE::PARENTSTRUCT* TREE::findParent(char* child)
{for (int i = 0; i < currentSite; ++i){if (strcmp(child, index[i]->data) == 0){return index[i]->parent;}}}
void TREE::addNode(char* data, char* parent)
{index[currentSite] = (PARENTSTRUCT*)malloc(sizeof(PARENTSTRUCT));strcpy(index[currentSite]->data, data);if (parent == nullptr){index[currentSite]->parent = nullptr;}else{for (int i = 0; i < currentSite; ++i){if (strcmp(parent, index[i]->data) == 0){index[currentSite]->parent = index[i];}}}currentSite++;return;
}
bool TREE::bTrueIfFullFilledTree()
{if (currentSite == 15){return true;}else{return false;}
}
void TREE::getParent(char* dest, char* child)
{PARENTSTRUCT* ptr = findParent(child);if (ptr != nullptr){strcpy(dest, ptr->data);}else{strcpy(dest, "抱歉,此为根");}return;
}

由下图数据来建一棵树,由此进行测试 

测试函数:

#include<stdio.h>
#include<iostream>
using namespace std;
#include"TREE.h"//上面提到的源码函数头文件
#include<windows.h>
int main()
{TREE tree;tree.addNode("A", nullptr);tree.addNode("B","A");tree.addNode("C", "A");tree.addNode("D", "B");tree.addNode("G", "D");tree.addNode("H", "D");tree.addNode("I", "D");tree.addNode("E", "C");tree.addNode("F", "C");tree.addNode("J", "E");char buff[40];tree.getParent(buff, "H");cout << "输出H的父母:" << buff << endl;tree.getParent(buff, "J");cout << "输出J的父母:" << buff << endl;system("pause");return 0;
}

运行结果:

往期精彩内容

数据结构第一天(生成1000以内的随机数自动填充数组)

数据结构第二天(直接插入排序/内存申请/指针操作)

数据结构第三天(折半插入排序)

数据结构第四天(希尔排序)

数据结构第五天(冒泡排序)

数据结构第六天(快速排序)

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

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

相关文章

C++重新入门-C++ 函数

函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&#xff0c;但在逻辑上&#xff0c;划分通常…

【JAVA-Day76】Java线程解析:三态和五态

Java线程解析&#xff1a;三态和五态 《Java线程状态深度解析&#xff1a;三态和五态探秘 &#x1f60e;》摘要引言一、什么是三态 &#x1f60a;二、什么是五态 &#x1f603;三、五态之间如何转变3.1 新建状态转换到运行状态3.2 运行状态转换到阻塞状态3.3 运行状态转换到等待…

为什么Python是数据科学家的首选语言

这篇文章全面探讨了Python作为数据科学领域首选语言的原因。从Python的历史、特性&#xff0c;到在数据科学中的应用实例&#xff0c;再到与其他数据科学语言的比较&#xff0c;以及在实际企业中的应用&#xff0c;我们深入剖析了Python的优势与挑战&#xff0c;最后对Python的…

【原创 附源码】Flutter安卓及iOS海外登录--Facebook登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月12日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&…

详细分析Redis中数值乱码的根本原因以及解决方式

目录 前言1. 问题所示2. 原理分析3. 拓展 前言 对于这方面的相关知识推荐阅读&#xff1a; Redis框架从入门到学精&#xff08;全&#xff09;Java关于RedisTemplate的使用分析 附代码java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09; …

nginx2

mkdir /usr/local/develop cd /usr/local/develop 下载 wget http://nginx.org/download/nginx-1.17.4.tar.gz yum install git git clone https://github.com/arut/nginx-rtmp-module.git 解压文件 tar zxmf nginx-1.17.4.tar.gz 进入解压目录 cd nginx-1.17.4/ 安装编译…

Ocr之TesseractOcr的安装及使用

目录 一、安装环境 二、安装内容 三、安装过程及识别测试 1. 安装过程 2. 程序编写 总结 1. 安装复杂度较低 2. 国外开源Ocr 3. 可设置识别参数 4. 工具类 一、 系统环境windows 10 linux环境也可安装, 可借鉴此篇文章>> | 二、安装内容 Tesseract exe 程序安…

锐捷(二十一)全局地址绑定

vlan划分和vlanif接口配置略&#xff0c;注意vlanif接口里要no shutdown配置如下&#xff1a; Address-bind 192.168.1.1 AAAA.BBBB.CCCCAddress-bind uplink g0/0Address-bind binding-filter loggingAddress-bind install 此时&#xff0c;IP为192.168.1.1 mac地址为AAAA.B…

2022年9月电子学会青少年软件编程 中小学生Python编程等级考试二级真题解析(选择题)

2022年9月Python编程等级考试二级真题解析 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、运行以下代码&#xff0c;结果输出的是 means[Thank,You] print(len(means)) A、1 B、2 C、6 D、8 答案&#xff1a;B 考点分析&#xff1a;考…

前端JavaScript篇之对象继承的方式有哪些?

目录 对象继承的方式有哪些&#xff1f;1. 原型链继承2. 借用构造函数3. 组合继承4. 原型式继承5. 寄生式组合继承 对象继承的方式有哪些&#xff1f; 1. 原型链继承 当使用原型链继承时&#xff0c;子类型的原型对象被设置为父类型的一个实例。这意味着子类型通过其原型可以…

【知识整理】技术新人的培养计划

一、培养计划落地实操 1. 概要 新人入职&#xff0c;要给予适当的指导&#xff0c;目标&#xff1a; 1、熟悉当前环境&#xff1a; 生活环境&#xff1a;吃饭、交通、住宿、娱乐 工作环境&#xff1a;使用的工具&#xff0c;Mac、maven、git、idea 等 2、熟悉并掌握工作技…

苹果Mac键盘如何将 F1 到 F12 取消按Fn

苹果电脑安装了Win10操作系统之后&#xff0c;F1到F12用不了怎么办的解决方法。本文将介绍一些解决方法&#xff0c;帮助您解决无法使用F1到F12功能键的问题。 使用 Mac系统的人都知道&#xff0c;Mac系统默认是没有开启 F1-F12 的使用的&#xff0c;平时我们使用的系统都可以使…