树的应用

在网上找树与二叉树的转换的算法一直没找到,只有图形讲解,只能怪自己技术太低,但是实验报告又得交啊.....难度A还算简单,只要遍历二叉树就行,但是难度B实现二叉树与树的相互转换感觉太不容易了,在网上找了半天还是不能做出来。于是翻开书仔细看,发现树的孩子兄弟表示法正好和二叉树的表示很像,于是利用二叉树的左子树和孩子兄弟表示法中的孩子指针相似,二叉树的右子树和孩子兄弟指针相似,于是终于在建立的二叉树的基础上把其对应的树的形式打印出来了。求高手指点指点:在这段代码的基础上实现真正的二叉树与树的转换。

下面是程序:

Code:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedefstructBiTNode{
  4. chardata;//定义二叉树的数据部分
  5. structBiTNode*lchild;//定义二叉树的左孩子(树的孩子)
  6. structBiTNode*rchild;//定义二叉树的右孩子(树的孩子兄弟)
  7. }BiTNode,*BiTree;
  8. voidCreatBiTree(BiTree*T)//创建二叉树
  9. {
  10. charch;
  11. ch=getchar();
  12. if(ch=='*')
  13. *T=NULL;
  14. else{
  15. if(!(*T=(BiTree)malloc(sizeof(structBiTNode)))){
  16. printf("内存分配失败!");return;
  17. }
  18. else{
  19. (*T)->data=ch;
  20. CreatBiTree(&((*T)->lchild));
  21. CreatBiTree(&((*T)->rchild));
  22. }
  23. }
  24. }
  25. voidPreOrderTraverse(BiTreeT)//前序遍历二叉树(递归)
  26. {
  27. if(T){
  28. printf("%c",T->data);
  29. if(T->lchild)
  30. PreOrderTraverse(T->lchild);
  31. if(T->rchild)
  32. PreOrderTraverse(T->rchild);
  33. }
  34. }
  35. voidInOrderTraverse(BiTreeT)//中序遍历二叉树(递归)
  36. {
  37. if(T){
  38. if(T->lchild)
  39. InOrderTraverse(T->lchild);
  40. printf("%c",T->data);
  41. if(T->rchild)
  42. InOrderTraverse(T->rchild);
  43. }
  44. }
  45. voidPostOrderTraverse(BiTreeT)//后序遍历二叉树(递归)
  46. {
  47. if(T){
  48. if(T->lchild)
  49. PostOrderTraverse(T->lchild);
  50. if(T->rchild)
  51. PostOrderTraverse(T->rchild);
  52. printf("%c",T->data);
  53. }
  54. }
  55. voidPrintBinary(BiTreeT,intnLayer)//打印二叉树
  56. {
  57. if(T==NULL)return;
  58. PrintBinary(T->rchild,nLayer+1);
  59. for(inti=0;i<=nLayer;i++)
  60. {printf("");}
  61. printf("%c/n",T->data);
  62. PrintBinary(T->lchild,nLayer+1);
  63. }
  64. voidPrintTree(BiTreeT,intnLayer)//将二叉树以树的形式打印出来
  65. {
  66. if(T==NULL)return;
  67. for(inti=0;i<=nLayer;i++)
  68. printf("");
  69. printf("%c/n",T->data);
  70. PrintTree(T->lchild,nLayer+1);
  71. PrintTree(T->rchild,nLayer);
  72. }
  73. intmain()//主函数部分
  74. {
  75. BiTreeT=NULL;
  76. intLayer=0;
  77. intLayerT=0;
  78. printf("请输入二叉树:/n");
  79. CreatBiTree(&T);printf("你输入的二叉树为:(竖型树状表示)/n");
  80. PrintBinary(T,Layer);
  81. printf("/n");
  82. printf("先序遍历二叉树为:/n");
  83. PreOrderTraverse(T);
  84. printf("/n");
  85. printf("中序遍历二叉树为:/n");
  86. InOrderTraverse(T);
  87. printf("/n");
  88. printf("后序遍历二叉树为:/n");
  89. PostOrderTraverse(T);
  90. printf("/n");
  91. printf("二叉树转换为树显示出来为:(竖型树状表示)/n");
  92. PrintTree(T,LayerT);
  93. system("pause");
  94. return0;
  95. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值