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

2024-02-08 17:04

本文主要是介绍数据结构第十四天(树的存储/双亲表示法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

概述

接口: 

源码:

测试函数:

运行结果:

往期精彩内容


前言

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

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

概述

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

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

  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.chinasem.cn/article/691644

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(