数据结构 二叉树的线索存储

举报
悦来客栈的老板 发表于 2020/12/29 01:26:32 2020/12/29
【摘要】 #include <stdio.h>#include <stdlib.h>#include <iostream.h> #define OK 1#define ERROR 0#define OVERFLOW -2 typedef char TElemType;typedef enum {Link,Thread} PointerTag...

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream.h>
  4. #define OK 1
  5. #define ERROR 0
  6. #define OVERFLOW -2
  7. typedef char TElemType;
  8. typedef enum {Link,Thread} PointerTag;
  9. typedef struct BiThrNode
  10. {
  11. TElemType data;
  12. struct BiThrNode *lchild,*rchild;
  13. PointerTag LTag;
  14. PointerTag RTag;
  15. }BiThrNode, *BiThrTree;
  16. BiThrTree pre;
  17. void Create_BiThrTree(BiThrTree &T)
  18. {
  19. TElemType ch;
  20. cin >> ch;
  21. if (ch == '#')
  22. {
  23. T = NULL;
  24. }
  25. else
  26. {
  27. T = (BiThrTree)malloc(sizeof(BiThrNode));
  28. if (!T)
  29. {
  30. exit(OVERFLOW);
  31. }
  32. T->data = ch;
  33. Create_BiThrTree(T->lchild);
  34. if (T->lchild)
  35. {
  36. T->LTag = Link;
  37. }
  38. Create_BiThrTree(T->rchild);
  39. if (T->rchild)
  40. {
  41. T->RTag = Link;
  42. }
  43. }
  44. }
  45. void InThreading(BiThrTree p)
  46. {
  47. if (p)
  48. {
  49. InThreading(p->lchild);
  50. if (!p->lchild)
  51. {
  52. p->LTag = Thread;
  53. p->lchild = pre;
  54. }
  55. if (!pre->rchild)
  56. {
  57. pre->RTag = Thread;
  58. pre->rchild = p;
  59. }
  60. pre = p;
  61. InThreading(p->rchild);
  62. }
  63. }
  64. int InOrderThreading(BiThrTree &Thrt, BiThrTree T)
  65. {
  66. if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode))))
  67. {
  68. exit(OVERFLOW);
  69. }
  70. Thrt->LTag = Link;
  71. Thrt->RTag = Thread;
  72. Thrt->rchild = Thrt;
  73. if (!T)
  74. {
  75. Thrt->lchild = Thrt;
  76. }
  77. else
  78. {
  79. Thrt->lchild = T;
  80. pre = Thrt;
  81. InThreading(T);
  82. pre->rchild = Thrt;
  83. pre->RTag = Thread;
  84. Thrt->rchild = pre;
  85. }
  86. return OK;
  87. }
  88. int InOrderTraverse_Thr(BiThrTree T)
  89. {
  90. BiThrTree p;
  91. p = T->lchild;
  92. while (p != T)
  93. {
  94. while (p->LTag == Link)
  95. {
  96. p = p->lchild;
  97. }
  98. printf("%c",p->data);
  99. while (p->RTag == Thread && p->rchild != T)
  100. {
  101. p = p->rchild;
  102. printf("%c",p->data);
  103. }
  104. p = p->rchild ;
  105. }
  106. return OK;
  107. }
  108. int main()
  109. {
  110. BiThrTree T,H;
  111. Create_BiThrTree(T);
  112. InOrderThreading(H,T);
  113. InOrderTraverse_Thr(T);
  114. printf("\n");
  115. return 0;
  116. }

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/17249281

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。