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

news2024/11/25 20:40:33

目录

前言

概述

接口

源码

测试函数

运行结果

往期精彩内容


前言

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

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

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;
}

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1444555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣面试题 17.04. 消失的数字(求和,位运算)

Problem: 面试题 17.04. 消失的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:求和 先求取1-n的数字和,再减去数组中所有元素的和即为缺失数 思路2:位运算 我们利用异或运算的特性:相同位为0,不同位为1;0与仍何数异或后得到仍何数,即我们先另一个变量(初始为0)与…

蓝牙 - BTSnoop File Format

1, Overview [ 概览 ] BTSnoop 文件格式适用于存储 Bluetooth HCI 通讯数据。它与 RFC 1761 中记录的 snoop 格式非常相似。 The BTSnoop file format is suitable for storing Bluetooth HCI traffic. It closely resembles the snoop format, as documented in RFC 1761. 2, …

Linux(Ubuntu) 环境搭建:Nginx

注&#xff1a;服务器默认以root用户登录 NGINX 官方网站地址&#xff1a;https://nginx.org/en/NGINX 官方安装文档地址&#xff1a;https://nginx.org/en/docs/install.html服务器的终端中输入以下指令&#xff1a; # 安装 Nginx apt-get install nginx # 查看版本信息 ngi…

【算法】排序详解(快速排序,堆排序,归并排序,插入排序,希尔排序,选择排序,冒泡排序)

目录 排序的概念&#xff1a; 排序算法的实现&#xff1a; 插入排序&#xff1a; 希尔排序&#xff1a; 选择排序&#xff1a; 堆排序&#xff1a; 冒泡排序&#xff1a; 快速排序&#xff1a; 快速排序的基本框架&#xff1a; 1.Hoare法 2. 挖坑法 3.前后指针法 快…

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …

基于POSCMS架构开发的素材资源网平台整站全面修复版源码

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 资源简介 基于POSCMS架构开发的素材资源网平台整站全面修复版源码一键安装版 系统功能介绍 支持文章、论坛、下载、…

解决 postman测试接口报404 Not Found

JDK版本&#xff1a;jdk17 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 问题描述原因分析解决方案 问题描述 当我使用postman测试接口时&#xff0c;报了 404 Not Found 的错误&#xff0c;报错截图如下所示 但我的后端程序中已经定义了该接口&#xff0c;如下所示 …

2024给你一些Android 应用性能优化的建议

2024给你一些Android 应用性能优化的建议 在当今激烈竞争的移动应用市场中&#xff0c;用户对应用性能和体验的要求越来越高。因此&#xff0c;进行 Android 应用性能优化是开发过程中必不可少的一环。下面将详细介绍如何提升应用的性能&#xff0c;以提升用户体验。 1. 优化…

静态时序分析:建立时间分析

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中&#xff0c;建立时间检查约束了触发器时钟引脚&#xff08;时钟路径&#xff09;和输入数据引脚&#xff08;数据路径&#xff09;之间的时序关系&#x…

EMC学习笔记(二十四)降低EMI的PCB设计指南(四)

降低EMI的PCB设计指南&#xff08;四&#xff09; 1.电路板分区2.信号走线2.1 电容和电感串扰2.2 天线2.3 端接和传输线2.4输入端的阻抗匹配 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.电路板分区 电路板分区与电路板平面规划具有相同的基本含义&#x…

ubuntu22.04 安装部署04:经常死机,鼠标,键盘无响应

相关文章&#xff1a; ubuntu22.04 安装部署01&#xff1a;禁用内核更新 ubuntu22.04安装部署02&#xff1a;禁用显卡更新 ubuntu22.04安装部署03&#xff1a; 设置root密码 一、现象说明 1. 开机一小时后&#xff0c;突然之间网络掉线&#xff0c;鼠标、键盘无反应。 2.…

数据结构|对称矩阵压缩存储的下标公式推导|如何求对称矩阵压缩存储对应的一维数组下标

因为考试的时候可能会给很多情况的变式题&#xff0c;所以要会推导而不是背公式&#xff0c;情况变了&#xff0c;公式就不管用了。 行优先、只存储主对角线下三角区&#xff1a; 矩阵下标 ai,j(i>j)->一维数组下标 B[k] 按照行优先的原则&#xff0c;确定 ai,j 是一维数…

[word] word分割线在哪里设置 #其他#经验分享

word分割线在哪里设置 在工作中有些技巧&#xff0c;可以快速提高工作效率&#xff0c;解决大部分工作&#xff0c;今天给大家分享word分割线在哪里设置的小技能&#xff0c;希望可以帮助到你。 1、快速输入分割线 输入三个【_】按下回车就是一条长直线&#xff0c;同样分别…

mysql、mybatis中SORT

SORT排序 根据数据表sys_series中HOT(int类型)进行升序排列: 原来的数据库中存储: 排序# 结果是HOT字段为null的所有数据都排在最前面,不为null的数据按升序排列 SELECT * FROM sys_series ORDER BY HOT;# 结果是HOT字段为null的所有数据都排在最后面,不为null的数据按数…

逆向实战29——某度 某家号2024旋转验证码识别

前言 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 目标网站 aHR0cHM6Ly9hd…

springboot177健身房管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

年假作业day2

1.打印字母图形 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int i,j; char k; for(i1;i<7;i) { for(j1;j<i;j) { printf("%c",_); } for(j0,…

假期day5

TCP UDP区别 共同点&#xff1a;都是属于传输层的协议 TCP&#xff1a;稳定。面向连接的&#xff0c;有可靠的数据传输服务。传输过程中数据无误&#xff0c;无丢失&#xff0c;无失序&#xff0c;无重复。传输效率低&#xff0c;耗费资源多。数据收发不同步&#xff0c;有沾…

docker核心技术

一. 从系统架构谈起 传统分层架构 vs 微服务 微服务改造 分离微服务的方法建议: 审视并发现可以分离的业务逻辑业务逻辑,在对业务领域不是特别熟悉的时候,按照部门职能进行划分,例如账号、财务等寻找天生隔离的代码模块,可以借助于静态代码分析工具如果可以闭环的解决一…

接口测试 05 -- 接口加密处理

前言 实际工作当中,涉及到接口加密时,每一个公司加密方式都是不一样的。 1. 遇到接口加密的解决方法: ① 如果是一些常用的加密,可以通过 (第三方)工具或者代码去解决。 ② 如果是开发自己封装的加密方法,核心逻辑外人是无法知道的,最好的方式让开发去协助你。提供接口去…