目录
前言
概述
接口
源码
测试函数
运行结果
往期精彩内容
前言
最近在知乎上看到的一个问题,
也许,短暂的离别,只为更好的相遇!
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;
}