【数据结构】树与二叉树(二):树的表示C语言:树形表示法、嵌套集合表示法、嵌套括号表示法 、凹入表示法

文章目录

  • 5.1 树的基本概念
    • 5.1.1 树的定义
    • 5.1.2 森林的定义
    • 5.1.3 树的术语
    • 5.1.4 树的表示
      • 1.树形表示法
      • 2.嵌套集合表示法
        • 结构体
        • 创建树
        • 主函数
      • 3.嵌套括号表示法
        • 结构体
        • 创建树
        • 嵌套括号表示法
        • 主函数
      • 4.凹入表示法
        • 结构体
        • 创建树
        • 凹入表示法
        • 主函数

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.1.4 树的表示

1.树形表示法

  树形表示法是一种图形化的表示方法,使用节点和边来表示树的结构。每个节点代表树中的一个元素,而边表示节点之间的关系。这种表示方法可以直观地展示树的层次结构和节点之间的连接关系。

在这里插入图片描述

2.嵌套集合表示法

  嵌套集合表示法使用集合的嵌套结构来表示树:每个集合代表一个节点,而集合中的元素表示该节点的子节点。通过嵌套的方式,可以表示出树的层次结构。

tree = {'value': 'A','children': [{'value': 'B','children': []},{'value': 'C','children': [{'value': 'D','children': []}]}]
}
结构体
#include <stdio.h>
#include <stdlib.h>struct TreeNode {int value;struct TreeNode** children;int numChildren;
};
创建树
struct TreeNode* createTreeNode(int value, int numChildren) {struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));node->value = value;node->numChildren = numChildren;node->children = (struct TreeNode**)malloc(numChildren * sizeof(struct TreeNode*));for (int i = 0; i < numChildren; i++) {node->children[i] = NULL;}return node;
}
主函数
int main() {struct TreeNode* root = createTreeNode(1, 2);struct TreeNode* node1 = createTreeNode(2, 0);struct TreeNode* node2 = createTreeNode(3, 1);struct TreeNode* node3 = createTreeNode(4, 0);root->children[0] = node1;root->children[1] = node2;node2->children[0] = node3;// 其他操作...return 0;
}

3.嵌套括号表示法

  嵌套括号表示法使用括号来表示树的结构:每对括号代表一个节点,而括号内的内容表示该节点的子节点。通过嵌套括号的方式,可以清晰地表示树的层次结构和节点之间的关系。

tree_str = '((A (B C)) D)'
结构体
#include <stdio.h>
#include <stdlib.h>struct TreeNode {int value;struct TreeNode* left;struct TreeNode* right;
};
创建树
struct TreeNode* createTreeNode(int value) {struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));node->value = value;node->left = NULL;node->right = NULL;return node;
}
嵌套括号表示法
// 根据嵌套括号表示法构建树
struct TreeNode* buildTreeFromParenthesis(char* treeStr, int* index) {struct TreeNode* node = NULL;int value = 0;int sign = 1;while (treeStr[*index] != '\0') {char c = treeStr[*index];(*index)++;if (c == '(') {if (node == NULL) {node = (struct TreeNode*)malloc(sizeof(struct TreeNode));node->left = NULL;node->right = NULL;}node->left = buildTreeFromParenthesis(treeStr, index);} else if (c == ')') {return node;} else if (c == '-') {sign = -1;} else if (c >= '0' && c <= '9') {value = value * 10 + (c - '0');} else if (c == ' ') {value *= sign;node->value = value;value = 0;sign = 1;}}return node;
}
主函数
int main() {char* treeStr = "(1 (2 (4) (5)) (3 (6)))";int index = 0;struct TreeNode* root = buildTreeFromParenthesis(treeStr, &index);// 其他操作...return 0;
}

4.凹入表示法

  凹入表示法使用缩进来表示树的结构:每个节点都在上一级节点的下方,并且比上一级节点缩进一定的距离。通过缩进的方式,可以清晰地展示树的层次结构和节点之间的嵌套关系。

结构体
#include <stdio.h>
#include <stdlib.h>struct TreeNode {int value;struct TreeNode* firstChild;struct TreeNode* nextSibling;
};
创建树
struct TreeNode* createTreeNode(int value) {struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));node->value = value;node->firstChild = NULL;node->nextSibling = NULL;return node;
}
凹入表示法
struct TreeNode* buildTreeFromIndented(char* treeStr, int* index, int level) {struct TreeNode* node = NULL;while (treeStr[*index] != '\0') {char c = treeStr[*index];(*index)++;if (c == '\n') {continue;}if (c == ' ') {continue;}if (c == '-') {level++;continue;}int value = c - '0';if (node == NULL) {node = createTreeNode(value);} else {struct TreeNode* child = createTreeNode(value);if (node->firstChild == NULL) {node->firstChild = child;} else {struct TreeNode* sibling = node->firstChild;while (sibling->nextSibling != NULL) {sibling = sibling->nextSibling;}sibling->nextSibling = child;}}int nextChar = treeStr[*index];if (nextChar == '\n') {level--;} else if (nextChar == '-') {continue;} else {break;}}return node;
}
主函数
int main() {char* treeStr = "1\n-2\n--4\n--5\n-3\n--6\n";int index = 0;struct TreeNode* root = buildTreeFromIndented(treeStr, &index, 0);// 其他操作...return 0;
}

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

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

相关文章

【Mybatis小白从0到90%精讲】15: Mybatis配置打印SQL日志

文章目录 前言配置日志实现前言 日志(Log)是每个程序都不可或缺的一部分,它可以帮助开发人员诊断和调试问题。Mybatis,作为一款备受赞誉的ORM框架,自然也提供了强大的日志功能。 它不仅提供了内置的标准实现,还支持集成各种主流的日志框架,让我们可以轻松地查看最终执行…

C-DS二叉树_另一棵树的子树

Description 给你两棵二叉树tree1和tree2,检验tree1中是否包含和tree2具有相同结构和结点值的子树。如果存在,输出true;否则,输出false。 Input 第一行输入t,表示有t个测试样例。 第二行首先输入n1,接着输入n1个整数,表示二叉树tree1。 第三行首先输入n2,接着输入n…

常见面试题-MySQL专栏(三)MVCC、BufferPool

typora-copy-images-to: imgs 了解 MVCC 吗&#xff1f; 答&#xff1a; MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 是用来保证 MySQL 的事务隔离性的&#xff0c;对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性&#xff0c;避免了频…

2023 现阶段H5的机型适配

个人愚见 现在的主流体验&#xff0c;是大屏手机展示更多的内容&#xff0c;并不着重于放大展示&#xff0c; 所以&#xff0c;外层布局使用vw,百分比&#xff0c;flex&#xff0c;内层直接px就行 比如微信服务页面&#xff0c;大屏下展示更多数据

晨控CK-GW08系列网关控制器与CODESYS软件MODBUSTCP通讯手册

晨控CK-GW08系列是一款支持标准工业通讯协议ModbusTCP的网关控制器,方便用户集成到PLC等控制系统中。系统还集成了8路读写接口&#xff0c;用户可通过通信接口使用Modbus TCP协议对8路读写接口所连接的读卡器进行相对独立的读写操作。 晨控CK-GW08系列网关控制器适用于本公司多…

Flink往Starrocks写数据报错:too many filtered rows

Bug信息 Caused by: com.starrocks.data.load.stream.exception.StreamLoadFailException: {"TxnId": 2711690,"Label": "cd528707-8595-4a35-b2bc-39b21087d6ec","Status": "Fail","Message": "too many f…

Git 安全警告修复手册:解决 `fatal: detected dubious ownership in repository at ` 问题 ️

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

httpclient工具类(支持泛型转换)

1、网上搜到的httpclient工具类的问题&#xff1a; 1.1、如下图我们都能够发现这种封装的问题&#xff1a; 代码繁杂、充斥了很多重复性代码返回值单一&#xff0c;无法拿到对应的Java Bean对象及List对象集合实际场景中会对接大量第三方的OPEN API&#xff0c;下述方法的扩展…

【电路笔记】-谐波

谐波 文章目录 谐波1、概述2、频谱分析3、已知信号4、未知信号5、总结 周期性信号并不总是完美的正弦模式&#xff0c;例如我们之前有关 正弦波的文章之一中介绍的那样。 有时&#xff0c;信号确实可以是简单正弦波的叠加&#xff0c;它们被称为复杂波形。 在本文中&#xff0…

HR的油猴脚本:前程无忧简历关键词统计

介绍 近年来&#xff0c;求职市场变得愈加竞争激烈&#xff0c;雇主和招聘人员需要花费大量的时间来筛选简历&#xff0c;以找到合适的候选人。这个Tampermonkey脚本“HR帮手”为前程无忧&#xff08;51job&#xff09;的HR提供了一种强大的工具&#xff0c;帮助他们快速筛选简…

60V、低 IQ、双通道LTC3892MPUH-2、LTC3892HUH-2、LTC3892IUH-2、LTC3892IUH两相同步降压型 DC/DC 控制器

概述&#xff1a; LTC3892 / LTC3892-2 是一款高性能、双通道降压型 DC/DC 开关稳压控制器&#xff0c;用于驱动全 N 沟道同步功率 MOSFET 级。通过使两个控制器输出级异相运作&#xff0c;可较大限度地降低功率损耗和噪声。 栅极驱动电压可设置在 5V 至 10V 的范围内&…

22款奔驰GLE450加装原厂360全景影像 打破死角

360全景影像影像系统提升行车时的便利&#xff0c;不管是新手或是老司机都将是一个不错的配置&#xff0c;无论是在倒车&#xff0c;挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况&#xff0c;避免盲区事故发生&#xff0c;提升行车出入安全性。 360全景影像包含&…