【数据结构】树与二叉树(十八):树的存储结构——Father链接结构、儿子链表链接结构

文章目录

  • 5.1 树的基本概念
    • 5.1.1 树的定义
    • 5.1.2 森林的定义
    • 5.1.3 树的术语
  • 5.2 二叉树
  • 5.3 树
    • 5.3.1 树的存储结构
      • 1. 理论基础
      • 2. 典型实例
    • 5.3.2 Father链接结构
      • a. 定义树节点结构
      • b. 创建新节点
      • c. 主函数
      • d. 代码整合
    • 5.3.3 儿子链表链接结构
      • a. 定义树节点结构
      • b. 创建新节点
      • c. 添加子节点作为第一个子节点
      • d. 遍历树打印节点数据
      • e. 主函数
      • f. 代码整合

5.1 树的基本概念

5.1.1 树的定义

  • 一棵树是结点的有限集合T:
    • 若T非空,则:
      • 有一个特别标出的结点,称作该树的,记为root(T);
      • 其余结点分成若干个不相交的非空集合T1, T2, …, Tm (m>0),其中T1, T2, …, Tm又都是树,称作root(T)的子树
    • T 空时为空树,记作root(T)=NULL。

5.1.2 森林的定义

  一个森林是0棵或多棵不相交(非空)树的集合,通常是一个有序的集合。换句话说,森林由多个树组成,这些树之间没有交集,且可以按照一定的次序排列。在森林中,每棵树都是独立的,具有根节点和子树,树与树之间没有直接的连接关系。
  森林是树的扩展概念,它是由多个树组成的集合。在计算机科学中,森林也被广泛应用于数据结构和算法设计中,特别是在图论和网络分析等领域。
在这里插入图片描述

5.1.3 树的术语

  • 父亲(parent)、儿子(child)、兄弟(sibling)、后裔(descendant)、祖先(ancestor)
  • 度(degree)、叶子节点(leaf node)、分支节点(internal node)
  • 结点的层数
  • 路径、路径长度、结点的深度、树的深度

参照前文:【数据结构】树与二叉树(一):树(森林)的基本概念:父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度

5.2 二叉树

5.3 树

5.3.1 树的存储结构

1. 理论基础

  1. Father链接结构:

    • 在这种结构中,每个节点除了存储数据外,还包含一个指向其父节点的指针。
    • 这种结构使得查找父节点很容易,但对于查找子节点则较为困难,因为需要遍历整个树。
    • 在二叉树中,每个节点最多有一个父节点,但在一般的树中,节点可以有多个父节点。
  2. 儿子链表链接结构:

    • 在这种结构中,每个节点包含一个指向其第一个子节点的指针,以及一个指向其下一个兄弟节点的指针。
    • 这种结构使得查找子节点很容易,但查找父节点较为困难,可能需要遍历兄弟节点链表直到找到相应的父节点。
  3. 左儿子右兄弟链接结构:

    • 也称为孩子兄弟表示法,每个节点包含一个指向其第一个子节点的指针,以及一个指向其下一个兄弟节点的指针。
    • 在这种结构中,树的每一层被表示为一个单链表,子节点通过左链连接,兄弟节点通过右链连接。
    • 这种结构既方便查找父节点,又方便查找子节点和兄弟节点,被广泛用于一般的树的表示。

  选择合适的树的存储结构通常取决于具体应用的需求。 Father链接结构适合于查找父节点的操作频繁,而儿子链表链接结构和左儿子右兄弟链接结构适用于频繁查找子节点的情况。

2. 典型实例

在这里插入图片描述

  1. Father链接结构:
    • A节点:父指针为null(A为根节点)
    • B节点:父指针指向A
    • C节点:父指针指向A
    • D节点:父指针指向A
    • E节点:父指针指向C
    • F节点:父指针指向C
  2. 儿子链表链接结构:
    • A节点:子节点链表为B、C、D
    • B节点:子节点链表为null
    • C节点:子节点链表为E、F
    • D节点:子节点链表为null
    • E节点:子节点链表为null
    • F节点:子节点链表为null
  3. 左儿子右兄弟链接结构:
    • A节点:左儿子为B,右兄弟为null
    • B节点:左儿子为null,右兄弟为C
    • C节点:左儿子为E,右兄弟为D
    • D节点:左儿子为null,右兄弟为null
    • E节点:左儿子为null,右兄弟为F
    • F节点:左儿子为null,右兄弟为null

5.3.2 Father链接结构

a. 定义树节点结构

typedef struct TreeNode {char data;              // 节点数据struct TreeNode* parent; // 指向父节点的指针
} TreeNode;

b. 创建新节点

TreeNode* createNode(char data) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));if (newNode == NULL) {fprintf(stderr, "Memory allocation failed\n");exit(EXIT_FAILURE);}newNode->data = data;newNode->parent = NULL;return newNode;
}

c. 主函数

int main() {// 创建节点TreeNode* nodeA = createNode('A');TreeNode* nodeB = createNode('B');TreeNode* nodeC = createNode('C');TreeNode* nodeD = createNode('D');TreeNode* nodeE = createNode('E');TreeNode* nodeF = createNode('F');// 构建树结构,设置父指针nodeB->parent = nodeA;nodeC->parent = nodeA;nodeD->parent = nodeA;nodeE->parent = nodeC;nodeF->parent = nodeC;// 打印每个节点及其父节点printf("Node %c, Parent: %c\n", nodeA->data, (nodeA->parent ? nodeA->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeB->data, (nodeB->parent ? nodeB->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeC->data, (nodeC->parent ? nodeC->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeD->data, (nodeD->parent ? nodeD->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeE->data, (nodeE->parent ? nodeE->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeF->data, (nodeF->parent ? nodeF->parent->data : 'N'));// 释放内存free(nodeA);free(nodeB);free(nodeC);free(nodeD);free(nodeE);free(nodeF);return 0;
}

d. 代码整合

#include <stdio.h>
#include <stdlib.h>// 定义树节点结构
typedef struct TreeNode {char data;              // 节点数据struct TreeNode* parent; // 指向父节点的指针
} TreeNode;// 创建新节点的函数
TreeNode* createNode(char data) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));if (newNode == NULL) {fprintf(stderr, "Memory allocation failed\n");exit(EXIT_FAILURE);}newNode->data = data;newNode->parent = NULL;return newNode;
}int main() {// 创建节点TreeNode* nodeA = createNode('A');TreeNode* nodeB = createNode('B');TreeNode* nodeC = createNode('C');TreeNode* nodeD = createNode('D');TreeNode* nodeE = createNode('E');TreeNode* nodeF = createNode('F');// 构建树结构,设置父指针nodeB->parent = nodeA;nodeC->parent = nodeA;nodeD->parent = nodeA;nodeE->parent = nodeC;nodeF->parent = nodeC;// 打印每个节点及其父节点printf("Node %c, Parent: %c\n", nodeA->data, (nodeA->parent ? nodeA->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeB->data, (nodeB->parent ? nodeB->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeC->data, (nodeC->parent ? nodeC->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeD->data, (nodeD->parent ? nodeD->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeE->data, (nodeE->parent ? nodeE->parent->data : 'N'));printf("Node %c, Parent: %c\n", nodeF->data, (nodeF->parent ? nodeF->parent->data : 'N'));// 释放内存free(nodeA);free(nodeB);free(nodeC);free(nodeD);free(nodeE);free(nodeF);return 0;
}

在这里插入图片描述

注:其他操作……有缘再见

5.3.3 儿子链表链接结构

a. 定义树节点结构

struct TreeNode {char data;struct TreeNode* child;struct TreeNode* sibling;
};

b. 创建新节点

struct TreeNode* createNode(char data) {struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->data = data;newNode->child = NULL;newNode->sibling = NULL;return newNode;
}

c. 添加子节点作为第一个子节点

void addChild(struct TreeNode* parent, struct TreeNode* child) {child->sibling = parent->child;parent->child = child;
}

d. 遍历树打印节点数据


void traverseTree(struct TreeNode* root) {if (root != NULL) {printf("%c\n", root->data);struct TreeNode* child = root->child;while (child != NULL) {printf("  %c (Child)\n", child->data);child = child->sibling;}// 递归遍历每个子节点child = root->child;while (child != NULL) {traverseTree(child);child = child->sibling;}}
}

e. 主函数

int main() {// 创建树节点struct TreeNode* A = createNode('A');struct TreeNode* B = createNode('B');struct TreeNode* C = createNode('C');struct TreeNode* D = createNode('D');struct TreeNode* E = createNode('E');struct TreeNode* F = createNode('F');// 构建树结构addChild(A, B);addChild(A, C);addChild(A, D);addChild(C, E);addChild(C, F);// 遍历并打印树节点traverseTree(A);// 释放内存free(A);free(B);free(C);free(D);free(E);free(F);return 0;
}

在这里插入图片描述

f. 代码整合

#include <stdio.h>
#include <stdlib.h>// 定义树节点结构
struct TreeNode {char data;struct TreeNode* child;struct TreeNode* sibling;
};// 创建新节点
struct TreeNode* createNode(char data) {struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->data = data;newNode->child = NULL;newNode->sibling = NULL;return newNode;
}// 添加子节点作为第一个子节点
void addChild(struct TreeNode* parent, struct TreeNode* child) {child->sibling = parent->child;parent->child = child;
}// 遍历树并打印节点
void traverseTree(struct TreeNode* root) {if (root != NULL) {printf("%c\n", root->data);struct TreeNode* child = root->child;while (child != NULL) {printf("  %c (Child)\n", child->data);child = child->sibling;}// 递归遍历每个子节点child = root->child;while (child != NULL) {traverseTree(child);child = child->sibling;}}
}int main() {// 创建树节点struct TreeNode* A = createNode('A');struct TreeNode* B = createNode('B');struct TreeNode* C = createNode('C');struct TreeNode* D = createNode('D');struct TreeNode* E = createNode('E');struct TreeNode* F = createNode('F');// 构建树结构addChild(A, B);addChild(A, C);addChild(A, D);addChild(C, E);addChild(C, F);// 遍历并打印树节点traverseTree(A);// 释放内存free(A);free(B);free(C);free(D);free(E);free(F);return 0;
}

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

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

相关文章

为什么录屏没声音?实用技巧大放送!

录屏已成为我们在数字时代记录和分享内容的重要方式之一。但有时&#xff0c;您可能会遇到录制视频却没有声音的问题。这个问题可能出现在不同的录屏软件中&#xff0c;导致许多人感到疑惑。在本文中&#xff0c;我们将探讨为什么录屏没声音&#xff0c;并提供两种解决方案&…

C语言实现堆栈和队列(动态)

行路难&#xff01;行路难&#xff01;多歧路&#xff0c;今安在&#xff1f;长风破浪会有时&#xff0c;直挂云帆济沧海。————李白 一 .堆栈 1 什么是堆栈 堆栈是一种特殊的线性表&#xff0c;堆栈中的元素以及元素之间的逻辑关系和线性表完全相同。在操作上的差别是线性…

springboot+jsp+bootstrap+java问卷调查系统

系统功能需求包含业务需求和功能需求&#xff0c;系统功能需求分析是在了解用户习惯、开发人员技术和实力等各个因素的前提下&#xff0c;对其进行深入分析&#xff0c;了解系统基本需求后&#xff0c;基本功能如下&#xff1a; 本课题要求实现优质的问卷调查系统&#xff0c;就…

安全框架springSecurity+Jwt+Vue-2(后端开发)

一、创建项目及配置 ①&#xff1a;创建新的项目及常用包 ②&#xff1a;引入依赖和配置 devtools&#xff1a;项目的热加载重启插件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId&…

如何配置ESB单据集成接口

ESB企业服务总线在实际项目中主要用于各业务系统之间的集成&#xff0c;集成包括数据集成、应用集成以及业务单据集成等&#xff0c;ESB企业服务总线主要包含三部分&#xff1a;ESB设计器、SMC管理控制台以及Server运行环境&#xff0c;ESB设计器用于服务以及集成流程的开发&am…

【C++ 设计模式】面向对象设计原则 Template Method 模式 Strategy 策略模式

一、面向对象设计原则 重新认识面向对象 理解隔离变化 • 从宏观层面来看&#xff0c;面向对象的构建方式更能适应软件的变化&#xff0c; 能将变化所带来的影响减为最小 各司其职 • 从微观层面来看&#xff0c;面向对象的方式更强调各个类的“责任” • 由于需求变化导…

Tesco EDI需求分析

Tesco&#xff0c;成立于1919年&#xff0c;是一家全球领先的综合性零售企业&#xff0c;总部位于英国。公司致力于提供高质量、多样化的商品和服务&#xff0c;以满足客户的需求。Tesco的使命是通过创新和卓越的客户服务&#xff0c;为客户创造更美好的生活。多年来&#xff0…

【idea】解决idea 执行maven build总下载 Downloading maven-metadata.xml文件

可以看到如下日志中打印了执行的命令行&#xff0c;其中包含 --update-snapshots&#xff0c;是强制更新的意思。 日志内容如下&#xff1a; D:\env\jdk1.8.0_261\bin\java.exe --update-snapshots -s D:\env\apache-maven-3.8.6\conf\settings.xml -Dmaven.repo.localD:\env\…

【开源】基于Vue.js的天然气工程业务管理系统的设计和实现

项目编号&#xff1a; S 021 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S021&#xff0c;文末获取源码。} 项目编号&#xff1a;S021&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四…

tomcat (SCI)ServletContainerInitializer 的加载原理

问题&#xff1a;使用WebScoket的时候发现通过ServerEndpoint方式注册上去的url无法访问&#xff0c;报错404 经过排查发现在WsServerContainer这个类中的addEndpoint方法一直没有触发ServerEndpoint注解的扫描 通过该方法来源于StandardContext.startInternal()方法的调用如下…

CSS特效015:7个小球转圈圈加载效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

ERP对接淘宝/天猫/京东/拼多多商品详情数据API接口

引言 今天&#xff0c;我们时代变化非常快&#xff0c;传统行业做法&#xff0c;已经无法完全适应时代的发展。互联网的发展&#xff0c;造成了一股网购热。京东&#xff0c;天猫&#xff0c;淘宝&#xff0c;易购……网购&#xff0c;给我们生活带来了方便&#xff0c;消费者…

人工智能:科技之光,生活之美

在科技飞速发展的今天&#xff0c;人工智能已经深入到我们的生活中&#xff0c;它如同一束璀璨的科技之光&#xff0c;照亮我们生活的每一个角落&#xff0c;使我们的生活更加美好。下面我将从人工智能的领域、应用以及对人工智能的看法三个方面来谈谈它对我们生活的影响。 一、…

最新红盟云卡个人自动发卡开源系统源码+全开源无加密+虚拟商品在线售卖平台

源码简介&#xff1a; 最新红盟云卡个人自动发卡开源系统源码全开源无加密虚拟商品在线售卖平台&#xff0c;支持多个接口的个人免签功能。 红盟云卡系统是一款基于PHP和MySQL开发的虚拟商品在线售卖平台。它具备美观且功能丰富的发卡网站特性&#xff0c;并可与社区进行无缝…

【量化】一个简版单档tick数据回测框架

这是一个简易的模拟实际交易流程的回测框架&#xff0c;所使用的行情数据是单档的tick成交数据。为了实现调用者可以实现自己的交易逻辑&#xff0c;本框架预留了几个函数予以调用者能够继承类后在子类中重写以实现买入卖出信号的生成&#xff08;check_sell()和check_buy()&am…

Docker Swarm总结

1、swarm 理论基础 1.1 简介 Docker Swarm 是由 Docker 公司推出的 Docker 的原生集群管理系统&#xff0c;它将一个 Docker 主机池变成了一个单独的虚拟主机&#xff0c;用户只需通过简单的 API 即可实现与 Docker 集群的通 信。Docker Swarm 使用 GO 语言开发。从 Docker 1.…

Ajax基础(应用场景|jquery实现Ajax|注意事项|Ajax发送json数据|Ajax携带文件数据)

文章目录 一、Ajax简介二、基于jquery实现Ajax三、使用Ajax注意的问题1.Ajax不要与form表单同时提交2.后端响应格式问题3、使用了Ajax作为请求后的注意事项 四、前后端数据传输的编码格式(content-Type)1.urlencoded2.formdata3.application/json 五、Ajax携带文件数据六、Ajax…

代码随想录第六十三天 | 单调栈:寻找 左边 / 右边 距离当前元素最近的 更小 元素的 下标(暴力,双指针,单调栈)(84);代码随想录主要题目结束

1、寻找 左边 / 右边 距离当前元素最近的 更小 元素的 下标 1.1 leetcode 84&#xff1a;柱状图中最大的矩形 第一遍代码思路错了&#xff0c;如&#xff1a;输入[2,1,2]&#xff0c;对于2&#xff0c;因为比栈顶元素1大&#xff0c;然后就会直接得出2&#xff08;1&#xff…

etoken是什么意思,有什么作用?

EToken是一种数字货币&#xff0c;它是由以太坊区块链平台发行的智能合约&#xff0c;旨在为以太坊生态系统提供一种安全、可靠、去中心化的交易媒介。EToken具有多种作用&#xff0c;下面将详细介绍。 一、EToken的定义和发行 EToken是由以太坊智能合约创建的数字货币&#xf…

渲染器——快速Diff算法

讨论第三种用于比较新旧两组子节点的方式&#xff1a;快速Diff 算法。正如其名&#xff0c;该算法的实测速度非常快。该算法最早应用于 ivi 和 inferno 这两个框架&#xff0c;Vue.js 3 借鉴并扩展了它。 下图比较了 ivi、inferno 以及 Vue.js 2 的性能&#xff1a; 上图来自…