当前位置: 首页 > news >正文

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

目录

前言

概述

接口: 

源码:

测试函数:

运行结果:

往期精彩内容


前言

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

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

概述

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

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

  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以内的随机数自动填充数组)

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

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

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

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

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

相关文章:

  • 【流程图——讲解】
  • Node.js开发-fs模块
  • python 人脸检测器
  • 基于ESP8266 开发板(MCU)遥控小车
  • 寒假学习记录16:Express框架(Node)
  • 搜索专项---最短路模型
  • Linux--编译器-gcc/g++使用
  • 二叉树相关OJ题
  • STM32自学☞定时器定时中断案例
  • Python爬虫下载小说
  • 人际交往中的勇气挑战与价值实现
  • 高效的工作学习方法
  • Vue2源码梳理:render函数的实现
  • iTop-4412 裸机程序(二十二)- RTC时钟
  • c++恶魔轮盘制造第1期输赢
  • 第62讲商品搜索动态实现以及性能优化
  • CTFshow web(php命令执行 55-59)
  • 容器高级知识: 适配器模式与 Sidecar 模式的区别
  • Python 读取pdf文件
  • 如何流畅进入Github
  • 宿州市委副书记任东已任市政府党组书记
  • 澎湃读报丨央媒头版集中刊发社论,庆祝“五一”国际劳动节
  • 5月起,这些新规将施行
  • 城市更新·简报│中央财政支持城市更新,倾斜超大特大城市
  • 书业观察|一本书的颜值革命:从毛边皮面到爆火的刷边书
  • 北京动物园:大熊猫“萌兰”没有参加日本大阪世博会的计划