原理:天勤高分笔记P155-P158

树输入的文本形式:AB0CE0F00D000

cstree

cstree1:AB0C0D000

cstree2:EF000

cstree3:GH0IJ0000

cstree1,2,3
#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语言:树与二叉树的转换相关推荐

  1. (王道408考研数据结构)第五章树-第三节4:树与二叉树的转换

    文章目录 一:树.二叉树和森林的转换 (1)树转化为二叉树 (2)森林转化为二叉树 (3)二叉树转化为树 (4)二叉树转化为森林 二:树与森林的遍历 (1)树的遍历 (2)森林的遍历 一:树.二叉树和 ...

  2. 树与二叉树的转换、树的遍历

    树和二叉树不同,可以有0到n个孩子,所以实现起来很麻烦,但我们可以借助树的孩子兄弟表示法把树转换成二叉树. 在孩子兄弟表示法中,某个结点的第一个孩子结点的指针是二叉树中其左孩子结点指针,右兄弟结点指针 ...

  3. 数据结构学习——树与二叉树的转换

    由于树和二叉树都可以用二叉链表作存储结构,则以二叉链表作媒介可以导出树与二叉树之间的一个对应关系. 一.将树转换成二叉树 (1)加线:在兄弟之间加一连线 (2)抹线:对每个结点,除了左孩子之外,去除其 ...

  4. 树到二叉树的转换就是这么简单

    二叉树是树结构的特例,现实生活中见的比较多的是多叉树.由于二叉树的链接浪费率最低,所以我们常常将树转化为二叉树来操作,这样不仅降低链接浪费率,而且还可以使得操作更加简便. 1. 树转化为二叉树 树转化 ...

  5. 树——通用树到二叉树的转换

    1,已经创建了通用树结构,有必要创建另一种树结构吗? 2,简化树就直接减少结点中孩子的数量,但是这样树还能通用吗? 3,通用树结构的回顾: 1,双亲孩子表示法: 1,每个结点都有一个指向双亲的指针: ...

  6. 树和二叉树的转换代码python_python数据结构之二叉树的统计与转换实例

    一.获取二叉树的深度就是二叉树最后的层次,如下图: 实现代码: def getheight(self): ''' 获取二叉树深度 ''' return self.__get_tree_height(s ...

  7. c++树及树与二叉树的转换

    此算法中的树结构为"左儿子有兄弟链接结构" 在这样的一个二叉树中,一个节点的左分支是他的大儿子节点,右分支为他的大兄弟节点. 这里讲的树有递归前根,中根,后根遍历,插入节点,插入兄 ...

  8. (转载)树、森林与二叉树的转换

    传送门 树.森林与二叉树的转换 1.树转换为二叉树 由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号. 将树转换成二叉树的步骤是: 加线.就是在所 ...

  9. C语言 数据结构 树和二叉树

    树 1.树:是n节点的有限集.树是n(n=>0)个节点的有限集. n=0时成为空树. 在任意一颗非空树中:(1)有且仅有一个称为根的节点:(2)当n>0时,其余节点可分为m(m>0) ...

最新文章

  1. 数据结构与算法:22 精选练习50
  2. spring+hibernate
  3. 深度丨《主算法》作者 Pedro Domingos 谈机器学习十大误解
  4. Linux运维常用命令总结
  5. 家中没有电脑,怎么用手机清除路由器垃圾,或更换路由器密码?
  6. IT职场人生系列之十六:入职(新手篇)
  7. c语言几个字符串排序,请教多个字符串排序(不用数组)
  8. 第29月第13天 程序员职业规划
  9. android studio for android learning (七) Android Log类全解
  10. 【图解线性代数】第二章——向量几何的基本意义【思维导图】
  11. NOIP2017错题
  12. 在AVEVA PDMSE3D软件实现三维二维码模型
  13. GeForce Experience界面重叠解决办法
  14. 全面赋能,OCR文字识别2022年多场景落地应用
  15. 第1讲(数据库软件的配置与游戏数据库的搭建)
  16. CentOS7 配置与管理DHCP服务器及DHCP中继代理 DHCP服务实训整合
  17. Linux监控利器nagios–NSCA被动监控
  18. B/S与C/S模式比较
  19. 六、【中级篇】看门狗(watch dog)
  20. initramfs实作

热门文章

  1. CPC (Contrastive Predictive Coding)
  2. 创意生日礼物生日视频,老婆生日要送什么礼物,告别毛绒娃娃
  3. Unity使用虚拟相机实现人物跟踪移动
  4. 银河英雄传说 - C++
  5. 简单抽样技术——简单随机样本方差是总体方差的无偏估计
  6. ASEMI-SL1550超低压降肖特基二极管型号
  7. 移动互联网的未来发展趋势
  8. 360周鸿祎:没有人比我更懂互联网安全
  9. 棋牌游戏通用牌型数值化方案
  10. 杰理-断码屏的显示其实也很酷炫