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

目录

前言

概述

接口: 

源码:

测试函数:

运行结果:

往期精彩内容


前言

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

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

概述

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

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

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

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

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

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

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

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

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值