目录

一、树的双亲表示

存储结构

总代码

二、树的孩子表示

存储结构

总代码

三、树的双亲孩子表示

存储结构


一、树的双亲表示

存储结构

采用结构体数组的形式存储数据。

(根结点parent=1:它没有双亲结点了)

//树的双亲表示
typedef struct
{char data;             //结点数据int parent;           //双亲在数组中的位置
}Tree;
Tree tree[MAXSIZE];

总代码

//树的双亲表示法(双亲树)
//getchar():吸收换行符
#include<stdio.h>#define MAXSIZE 20
int count = 0;//树的双亲表示
typedef struct
{char data;             //结点数据int parent;           //双亲在数组中的位置
}Tree;
Tree tree[MAXSIZE];//双亲树的初始化
void Init_Tree()
{tree[0].parent = -1;
}//创建树
void Create_Tree()
{int i, n = 0;printf("请输入结点个数:\n");scanf_s("%d", &n);getchar();                                         //这里吸收换行符printf("请依次输入结点数据和双亲结点序号:\n");for (i = 0; i < n; i++){scanf_s("%c", &(tree[i].data));     //输入数据scanf_s("%d", &(tree[i].parent));   //输入双亲结点getchar();                                      //这里吸收换行符count++;}
}//遍历树
void Traverse()
{int i = 0;for (i = 0; i < count; i++){printf("%c的双亲结点:%d\n", tree[i].data, tree[i].parent);}
}int main()
{Init_Tree();           //初始化Create_Tree();     //创建树Traverse();            //遍历树return 0;
}

二、树的孩子表示

存储结构

先创建一个结构体数组,用*firstchild连接它们的第一个孩子结点,用*next连接后面的孩子结点。最后把地址赋空(注:这里把地址赋空用的是二级指针,能同步改变根结点的地址,但凡需要地址的改变都要二级指针,二级指针是个难点,单独放在另一篇博客中)

//孩子结点
typedef struct Child
{int child;struct Child** next;
}Child, *pChild;

总代码

//树的孩子表示法
//两个结构体:
//一个结构体数组存放整体数据元素,里面有*firstchild指针指向第一个孩子
//一个孩子链表存放孩子信息
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>#define MAXSIZE 20
int length = 0;                    //数组长度//孩子结点
typedef struct Child
{int child;struct Child** next;
}Child, * pChild;               //*pChild:创建二级指针//树
typedef struct
{char data;Child* firstchild;
}Tree;
Tree T[MAXSIZE];//输入
void InputTree()
{int i;char ch;Child* child;printf("请输入您需要创建的结点数据:\n");scanf("%c", &ch);for (i = 0; i < MAXSIZE && ch != '\n'; i++){T[i].data = ch;scanf("%c", &ch);}length = i;                    //记录数据长度(数组)
}//初始化
void InitTree()
{int i;for (i = 0; i < length; i++){T[i].firstchild = NULL;}
}//根据结点数据查找孩子下标
int FindIndex(char ch)
{int i = 0;for (i = 0; i < length; i++){if (T[i].data == ch)return i;}return -1;
}//创建树
void CreateTree()
{int i = 0;char ch;pChild* p = NULL;                  //二级指针for (i = 0; i < length; i++){printf("请输入%c的孩子结点数据(没有就直接回车):  ", T[i].data);scanf("%c", &ch);//首孩子if (ch != '\n'){T[i].firstchild = (Child*)malloc(sizeof(Child));  //创建指向首孩子的指针p = (pChild*)malloc(sizeof(pChild));               //孩子指针p = &T[i].firstchild;                                            //孩子指针指向首孩子指针(*p)->child = FindIndex(ch);(*p)->next = (pChild*)malloc(sizeof(pChild));*((*p)->next) = NULL;                                     //一级指针赋NULLscanf("%c", &ch);}//后面的孩子while (ch != '\n'){//二级指针的操作(给*p地址)(*p)->next = (pChild*)malloc(sizeof(pChild)); //创建指向首孩子的指针    (p: 二级指针有地址)p = (*p)->next;                                               //后移                                (next: 二级指针有地址)//一级指针的操作(给*p地址)(*p) = (Child*)malloc(sizeof(pChild));              //创建一级指针(*p)->child = FindIndex(ch);                            //(*p)一级指针并没有地址!!!//在二级指针的基础上,要把一级指针浮NULL,必须得先给二级指针地址(*p)->next = (pChild*)malloc(sizeof(pChild));*((*p)->next) = NULL;                                      //一级指针赋NULLscanf("%c", &ch);}}
}//遍历树
void Traverse()
{int i;Child* p = NULL;for (i = 0; i < length; i++){p = T[i].firstchild;printf("\n%c的孩子结点(下标):", T[i].data);while (p != NULL){printf("%d ", p->child);p = *(p->next);}}
}int main()
{InputTree();InitTree();CreateTree();               //创建树Traverse();                    //遍历return 0;
}

三、树的双亲孩子表示

存储结构

总代码

//树的双亲孩子表示法
#include <stdio.h>
#include <malloc.h>#define MAXSIZE 20
int sum = 0;//孩子结点
typedef struct Child
{int index;struct Child* next;
}Child;
Child* now;//树
typedef struct
{char data;int childNum;char parent;Child* firstchild;
}Tree;
Tree tree[MAXSIZE];//初始化
void Init_Tree()
{now = (Child*)malloc(sizeof(Child));tree[0].parent = NULL;
}//创建树
void Create_Tree()
{int num, i, j;Child* child;printf("请输入您需要创建的结点个数:\n");scanf_s("%d", &sum);                                                  //结点总数getchar();//输入数组列表for (i = 0; i < sum; i++){printf("\n请输入第%d个结点数据:\n", i + 1);scanf_s("%c", &tree[i].data);                                 //输入数据getchar();printf("请输入%c结点的孩子结点个数:\n", tree[i].data);scanf_s("%d", &num);                                               //孩子节点总数getchar();//输入孩子结点if (num)          //num!=0printf("请分别输入%c结点的孩子结点在数组中的位置:\n", tree[i].data);for (j = 0; j < num; j++){child = (Child*)malloc(sizeof(Child));                  //创建孩子结点child->next = NULL;scanf_s("%d", &child->index);                               //孩子节点在数组中的下标getchar();tree[child->index].parent = tree[i].data;                //设置孩子结点的双亲结点//连接到上一个if (j == 0){tree[i].firstchild = child;child->next = NULL;}else{now->next = child;                                  //指向当前结点}now = child;tree[i].childNum++;}}
}//遍历树
void Traverse()
{int i, j;Child* now;for (i = 0; i < sum; i++){printf("\n第%d个结点:%c\n", i + 1, tree[i].data);now = tree[i].firstchild;                                  //指向第一个叶子结点printf("%c结点的双亲结点:%c\n", tree[i].data, tree[i].parent);for (j = 0; j < tree[i].childNum; j++){printf("%c结点的第%d个孩子结点:%c\n", tree[i].data, j + 1, tree[now->index].data);now = now->next;                                      //往后移}}
}int main()
{Init_Tree();Create_Tree();             //创建树Traverse();                    //遍历return 0;
}

数据结构与算法(6-1)树的存储(树的双亲表示、树的孩子表示及树的双亲孩子表示)相关推荐

  1. C++(数据结构与算法):42---优先级队列的实现(扩充二叉树、高度优先左高树(HBLT)、重量优先左高树(WBLT))

    本文代码下载: 方式1:公众号[多栖技术控小董]回复[3586]免费获取下载链接 方式2:CSDN下载链接:https://download.csdn.net/download/qq_41453285 ...

  2. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)

    查找: 给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败 查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序 动态查找表:查找的同时做修改操作( ...

  3. 数据结构与算法——栈的链式存储结构及实现

    目录 前言 一.栈的链式储存结构 二.栈的链式储存结构的操作 2.1   进栈操作 2.2   出栈操作 总结 前言 讲完了栈的顺序储存结构,我们现在来看看栈的链式存储结构,简称为链栈. 由于单链表中 ...

  4. 【数据结构与算法基础】树与二叉树的互化

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  5. java算法 例 百度云_Java版数据结构与算法(20集版)视频教程百度云下载

    课程目录: 1 Y) C+ M. ~9 S' r7 i  J# _数据结构-Java版(20集)7 {2 h5 w' i9 C' }& }$ J |____第20讲 - 图的最小生成树.avi ...

  6. 数据结构与算法之完全二叉树的节点个数

    数据结构与算法之完全二叉树的节点个数 目录 数据结构与算法之完全二叉树的节点个数 1. 数据结构与算法之完全二叉树的节点个数 (一)思路 先遍历左边界获得树的高度h 遍历右子树的左边界,看看到没到最后 ...

  7. PTA 数据结构与算法题目集(中文)

    一:数据结构与算法题目(中文版) 7-2 一元多项式的乘法与加法运算 (20 分) 7-3 树的同构 (25 分) 7-4 是否同一棵二叉搜索树 (25 分) 7-6 列出连通集 (25 分)(详解) ...

  8. MySQL中一个B+树能存储多少数据

    MySQL聚簇索引的存储结构 MySQL中InnoDB页的大小默认是16k.也可以自己进行设置.(计算机在存储数据的时候,最小存储单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如 XFS/ ...

  9. 树的存储结构 - 数据结构和算法41

    树的存储结构 让编程改变世界 Change the world by program 树的存储结构 不好意思哈,这节课又需要大家搞脑子了.对于知识,你理解的越多,需要记住的就越少! 上节课我们简单的介 ...

最新文章

  1. 【RocketMQ工作原理】offset管理
  2. cass字体_不动产 准备工作 第一步: 管理CASS码
  3. PWN-COMPETITION-HGAME2022-Week4
  4. nebula模拟器_nebula模拟器中文金手指版本
  5. 近一周学习之-----npm换源工具之nrm
  6. Pravega Flink connector 的过去、现在和未来
  7. 网络安全 Python 编程指南
  8. java 时间格式化 注解_Java关于时间格式化的方法
  9. CAD中插入外部参照字体会变繁体_打开CAD图纸发现图形丢失,原来是大意了,四招解决...
  10. 项目一——电子通讯录
  11. Saltstack_使用指南11_配置管理-状态之间依赖关系
  12. 分分钟穿透手机,实现远程控制
  13. 微信小程序实现保存影集和图片到相册
  14. PDF各种格式相互转换
  15. 深度搜索(DFS)和广度搜索(BFS)
  16. iptables -j MARK --set-xmark 解析
  17. 【AtCoder】AtCoder Grand Contest 046
  18. Idea中自动注释的缩进(避免添加注释自动到行首)
  19. “npm”‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  20. TraceBack的用法

热门文章

  1. Android中Intent传值
  2. .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)
  3. David与Vincent的博弈游戏[树型DP]
  4. 第一次软件工程作业(改进版)
  5. 2022-2028年中国电动汽车充换电站市场深度调研及投资前景预测报告(全卷)
  6. Android studio第一次使用配置(三)gradle项目构建
  7. 转--Android如何在java代码中设置margin
  8. C#线程间操作无效: 从不是创建控件 XX 的线程访问它
  9. 成长轨迹44 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2799、2976、2975、2742】...
  10. 端口01 - 零基础入门学习汇编语言67