数据结构第十五天(树的存储/孩子表示法)

目录

前言

概述

接口

源码

测试函数

运行结果

往期精彩内容


前言

最近在知乎上看到的一个问题,

也许,短暂的离别,只为更好的相遇!

2024,友友们,龙年快乐,新的一年,祝愿码上升薪,一头黑发无烦恼。

概述

树的存储孩子表示法是一种常见的树的存储方式,也被称为多重链表表示法。这种方式是通过记录每个节点的所有子节点来实现的。

具体地,对于每个节点,它的所有子节点都被保存在一个链表中,这个链表中的每个元素都指向该节点的一个子节点。如果节点没有子节点,则该链表为空。同时,该节点还需要保存它的父节点的指针,以便能够在需要时回溯到父节点。

这种方式的优点在于可以快速访问任意节点的子节点,因为每个节点的子节点都被直接存储在链表中,不需要遍历整个树来查找。同时,也可以方便地插入和删除节点,只需要修改相应的链表即可。

然而,这种方式也有一些缺点。首先,它需要额外的空间来保存每个节点的子节点链表和父节点指针,空间占用较大。其次,由于每个节点的子节点链表是无序的,因此在查找特定子节点时可能需要遍历整个链表才能找到目标节点,效率较低。

总而言之,树的存储孩子表示法是一种简单且易于实现的树结构存储方式,它适用于小规模的树和需要快速访问子节点的场景。

接口

    void addNode(char* data);
	void addChild(char* parent, char* child);
	void getChild(char* parent);

源码

#include <malloc.h>
#include<string.h>
#include<iostream>
using namespace std;
class TREECHILD
{
private:
	struct DATA
	{
		char data[15];
		struct DATA* next;
		struct DATA* child;
	};
	struct DATA* head = nullptr, *tail = nullptr;
private:
	struct DATA* getPtrOfData(char* data);
public:
	TREECHILD(){
		head = tail = (struct DATA*)malloc(sizeof(struct DATA));
	}
	void addNode(char* data);
	void addChild(char* parent, char* child);
	void getChild(char* parent);
};
struct TREECHILD::DATA* TREECHILD::getPtrOfData(char* data)
{
	struct DATA* ptr = head;
	while (ptr != nullptr)
	{
		if (strcmp(data, ptr->data) == 0)
		{
			return ptr;
		}
		ptr = ptr->next;
	}
	return nullptr;
}
void TREECHILD::getChild(char* parent)
{
	struct DATA* ptr = getPtrOfData(parent);
	ptr = ptr->child;
	while (ptr != nullptr)
	{
		cout << ptr->data << endl;
		ptr = ptr->child;
	}
	return ;
}
void TREECHILD::addNode(char* data)
{
	strcpy(tail->data, data);
	tail->next = (struct DATA*)malloc(sizeof(struct DATA));
	tail->child = nullptr;
	tail = tail->next;
	tail->next=nullptr;
	return;
}
void TREECHILD::addChild(char* parent, char* child)
{
	struct DATA* parentPtr = getPtrOfData(parent);
	if (parentPtr->child == nullptr)
	{
		parentPtr->child = (struct DATA*)malloc(sizeof(struct DATA));
		strcpy(parentPtr->child->data, child);
		parentPtr->child->child = nullptr;
		parentPtr->child->next = nullptr;
	}
	else{
		struct DATA* ptr = nullptr;
		ptr = parentPtr->child;
		parentPtr->child = (struct DATA*)malloc(sizeof(struct DATA));
		strcpy(parentPtr->child->data, child);
		parentPtr->child->child = ptr;
		parentPtr->child->next = nullptr;
	}
	return;
}

 以下为测试用例:

测试函数

#include<stdio.h>
#include<iostream>
using namespace std;
#include"TREE(child express).h"//(树存储孩子表示法头文件)
#include<windows.h>
int main()
{
//树表示法(孩子表示法)测试
	TREECHILD treeChild;
	//创建树的节点
	treeChild.addNode("A");
	treeChild.addNode("B");
	treeChild.addNode("C");
	treeChild.addNode("D");
	treeChild.addNode("E");
	treeChild.addNode("F");
	treeChild.addNode("G");
	treeChild.addNode("H");
	treeChild.addNode("I");
	treeChild.addNode("J");
	//添加孩子链表
	treeChild.addChild("A", "B");
	treeChild.addChild("A", "C");
	treeChild.addChild("B", "D");
	treeChild.addChild("D", "G");
	treeChild.addChild("D", "H");
	treeChild.addChild("D", "I");
	//输出孩子
	cout << "输出A的孩子:" << endl;
	treeChild.getChild("A");
	cout << "输出B的孩子:" << endl;
	treeChild.getChild("B");
	cout << "输出D的孩子:" << endl;
	treeChild.getChild("D");

	system("pause");
	return 0;
}

运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值