C语言:树与二叉树的转换
原理:天勤高分笔记P155-P158
树输入的文本形式:AB0CE0F00D000
cstree1:AB0C0D000
cstree2:EF000
cstree3:GH0IJ0000
#include <stdio.h>
#include <stdlib.h>
#define maxSize 100//树的定义
typedef struct CSNode
{char data;struct CSNode *firstchild, *nextsibling;
}CSNode, *CSTree;//二叉树的定义
typedef struct BTNode
{char data;struct BTNode* lchild;struct BTNode* rchild;
}BTNode;//新森林定义
typedef struct
{CSTree ct[maxSize];int num;
}Forest; //旧森林定义
/*typedef struct
{CSTree *ct;int num;
}Forest;*///存储路径定义
typedef struct
{char path[100];
}Str;//文件指针
FILE* fp;//创建一棵树
CSTree CreateCSTree()
{char ch;fscanf(fp, "%c", &ch);CSTree CT = NULL;if (ch != '0'){CT = (CSNode*)malloc(sizeof(CSNode));CT->data = ch;CT->firstchild = CreateCSTree();CT->nextsibling = CreateCSTree();}return CT;
}//树转换成二叉树
BTNode* ExchangeToBTree(CSTree ct)
{if (ct == NULL)return NULL;else{BTNode * bt = (BTNode*)malloc(sizeof(BTNode));bt->data = ct->data;bt->lchild = ExchangeToBTree(ct->firstchild);bt->rchild = ExchangeToBTree(ct->nextsibling);return bt;}
}//二叉树转换成树
CSTree ExchangeToCSTree(BTNode *bt)
{if (bt == NULL)return NULL;else{CSTree ct = (CSNode*)malloc(sizeof(CSNode));ct->data = bt->data;ct->firstchild = ExchangeToCSTree(bt->lchild);ct->nextsibling = ExchangeToCSTree(bt->rchild);return ct;}
}//森林转二叉树
BTNode* ForestToBTree(CSTree F[], int low, int high)
{//low为当前指向的树,high为第n棵树的下标n-1if (low > high)return NULL;else{BTNode* root = ExchangeToBTree(F[low]);//二叉树的根即为第一棵树的根,同时二叉树的左孩子是第一棵树根节点的子树森林转化成的二叉树root->rchild = ForestToBTree(F, low + 1, high);//二叉树的右子树是森林其他树转换成的二叉树return root;}
}//二叉树转森林
Forest* BTreeToForest(BTNode* root)
{BTNode* p = root;//森林初始化Forest* F = (Forest*)malloc(sizeof(Forest));BTNode* q = NULL;int i = 0;//统计树的个数//将二叉树转化为森林,核心代码while (p != NULL){q = p->rchild;//先用q指向下一棵树的根节点p->rchild = NULL;//将当前有右孩子的二叉树的右孩子链接断开F->ct[i++] = ExchangeToCSTree(p);//将二叉树转化为树p = q;//将p指向下一棵树}F->num = i;return F;
}
/*void BTreeToForest(Forest* F, BTNode* root)
{BTNode* p = root;int n = 0;//计算二叉树内包含了多少棵树while (p){++n;p = p->rchild;}//如果是一个空的二叉树,则森林也为空if (n == 0){F->ct = NULL;F->num = 0;}else{//森林初始化,创建一个包含n棵树的数组,数组元素为CSNode*类型,即CSTree类型F->ct = (CSTree*)malloc(sizeof(CSTree)*n);BTNode* q = NULL;int i = 0;p = root;//将二叉树转化为森林,核心代码while (p != NULL){q = p->rchild;//先用q指向下一棵树的根节点p->rchild = NULL;//将当前有右孩子的二叉树的右孩子链接断开F->ct[i++] = ExchangeToCSTree(p);//将二叉树转化为树p = q;//将p指向下一棵树}F->num = n;}
}*///二叉树先序遍历
void preorder(BTNode* bt)
{if (bt != NULL){printf("%c", bt->data);preorder(bt->lchild);preorder(bt->rchild);}
}//二叉树中序遍历
void inorder(BTNode* bt)
{if (bt != NULL){inorder(bt->lchild);printf("%c", bt->data);inorder(bt->rchild);}
}//树的先序遍历
void preorder_cstree(CSTree ct)
{if (ct != NULL){printf("%c", ct->data);preorder_cstree(ct->firstchild);preorder_cstree(ct->nextsibling);}
}//树的后序遍历=二叉树的中序遍历
void inorder_cstree(CSTree ct)
{if (ct != NULL){inorder_cstree(ct->firstchild);printf("%c", ct->data);inorder_cstree(ct->nextsibling);}
}//森林先序遍历
void preorder_forest(Forest*f)
{int i;for (i = 0; i < f->num; ++i)preorder_cstree(f->ct[i]);
}//森林后序遍历
void inorder_forest(Forest*f)
{int i;for (i = 0; i < f->num; ++i)inorder_cstree(f->ct[i]);
}int main()
{//用来测试树的创建、森林转二叉树、二叉树转森林//创建一个森林CSTree F[3];Str ps[3] = { "C:\\CodeBlocksProject\\cstree1.txt" ,"C:\\CodeBlocksProject\\cstree2.txt" ,"C:\\CodeBlocksProject\\cstree3.txt" };int length = 3;for (int i = 0; i < length; i++){fp = fopen(ps[i].path, "r");F[i] = CreateCSTree();fclose(fp);}//森林转二叉树BTNode* bt = ForestToBTree(F, 0, length - 1);//二叉树转森林Forest* F2;F2 = BTreeToForest(bt);inorder_forest(F2);//对森林的第三棵树进行树的前序遍历,测试代码正确性//preorder_cstree(F2->ct[0]);//下面注释掉的内容是对创建树、树转二叉树、二叉树转树的代码测试//fp = fopen("C:\\CodeBlocksProject\\cstree.txt", "r");//CSTree ct = CreateCSTree();//preorder_cstree(ct);//BTNode* bt = ExchangeToBTree(ct);//CSTree ct2 = ExchangeToCSTree(bt);//preorder_cstree(ct2);//preorder(bt);//inorder(bt);system("pause");return 0;
}
C语言:树与二叉树的转换相关推荐
- (王道408考研数据结构)第五章树-第三节4:树与二叉树的转换
文章目录 一:树.二叉树和森林的转换 (1)树转化为二叉树 (2)森林转化为二叉树 (3)二叉树转化为树 (4)二叉树转化为森林 二:树与森林的遍历 (1)树的遍历 (2)森林的遍历 一:树.二叉树和 ...
- 树与二叉树的转换、树的遍历
树和二叉树不同,可以有0到n个孩子,所以实现起来很麻烦,但我们可以借助树的孩子兄弟表示法把树转换成二叉树. 在孩子兄弟表示法中,某个结点的第一个孩子结点的指针是二叉树中其左孩子结点指针,右兄弟结点指针 ...
- 数据结构学习——树与二叉树的转换
由于树和二叉树都可以用二叉链表作存储结构,则以二叉链表作媒介可以导出树与二叉树之间的一个对应关系. 一.将树转换成二叉树 (1)加线:在兄弟之间加一连线 (2)抹线:对每个结点,除了左孩子之外,去除其 ...
- 树到二叉树的转换就是这么简单
二叉树是树结构的特例,现实生活中见的比较多的是多叉树.由于二叉树的链接浪费率最低,所以我们常常将树转化为二叉树来操作,这样不仅降低链接浪费率,而且还可以使得操作更加简便. 1. 树转化为二叉树 树转化 ...
- 树——通用树到二叉树的转换
1,已经创建了通用树结构,有必要创建另一种树结构吗? 2,简化树就直接减少结点中孩子的数量,但是这样树还能通用吗? 3,通用树结构的回顾: 1,双亲孩子表示法: 1,每个结点都有一个指向双亲的指针: ...
- 树和二叉树的转换代码python_python数据结构之二叉树的统计与转换实例
一.获取二叉树的深度就是二叉树最后的层次,如下图: 实现代码: def getheight(self): ''' 获取二叉树深度 ''' return self.__get_tree_height(s ...
- c++树及树与二叉树的转换
此算法中的树结构为"左儿子有兄弟链接结构" 在这样的一个二叉树中,一个节点的左分支是他的大儿子节点,右分支为他的大兄弟节点. 这里讲的树有递归前根,中根,后根遍历,插入节点,插入兄 ...
- (转载)树、森林与二叉树的转换
传送门 树.森林与二叉树的转换 1.树转换为二叉树 由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号. 将树转换成二叉树的步骤是: 加线.就是在所 ...
- C语言 数据结构 树和二叉树
树 1.树:是n节点的有限集.树是n(n=>0)个节点的有限集. n=0时成为空树. 在任意一颗非空树中:(1)有且仅有一个称为根的节点:(2)当n>0时,其余节点可分为m(m>0) ...
最新文章
- 数据结构与算法:22 精选练习50
- spring+hibernate
- 深度丨《主算法》作者 Pedro Domingos 谈机器学习十大误解
- Linux运维常用命令总结
- 家中没有电脑,怎么用手机清除路由器垃圾,或更换路由器密码?
- IT职场人生系列之十六:入职(新手篇)
- c语言几个字符串排序,请教多个字符串排序(不用数组)
- 第29月第13天 程序员职业规划
- android studio for android learning (七) Android Log类全解
- 【图解线性代数】第二章——向量几何的基本意义【思维导图】
- NOIP2017错题
- 在AVEVA PDMSE3D软件实现三维二维码模型
- GeForce Experience界面重叠解决办法
- 全面赋能,OCR文字识别2022年多场景落地应用
- 第1讲(数据库软件的配置与游戏数据库的搭建)
- CentOS7 配置与管理DHCP服务器及DHCP中继代理 DHCP服务实训整合
- Linux监控利器nagios–NSCA被动监控
- B/S与C/S模式比较
- 六、【中级篇】看门狗(watch dog)
- initramfs实作