C语言二叉树(先中后序遍历、层序遍历、非递归先中后序遍历)

浅浅的花香味﹌ 2022-12-28 13:00 225阅读 0赞

欢迎大家交流指正

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MAXSIZE_QUEUE 1000
  4. #define MAXSIZE_STACK 1000
  5. typedef char TElemType;
  6. typedef int Statistics;
  7. //树的结构体
  8. typedef struct BitNode
  9. {
  10. TElemType data;
  11. Statistics count; //非递归后续遍历使用,用于统计次数
  12. struct BitNode *lchlid,*rchlid;
  13. }BitNode;
  14. //队列结构体
  15. typedef struct
  16. {
  17. BitNode **base;
  18. int front,rear;
  19. }Queue;
  20. //栈
  21. typedef struct
  22. {
  23. BitNode **base;
  24. int top;
  25. }Stack;
  26. //初始化队列
  27. void InitQueue(Queue *T)
  28. {
  29. T->base=(BitNode **)malloc(sizeof(BitNode *)*MAXSIZE_QUEUE);
  30. if(!T->base) exit(0);
  31. T->front=T->rear=0;
  32. }
  33. //初始化栈
  34. void InitStack(Stack *L)
  35. {
  36. L->base=(BitNode **)malloc(sizeof(BitNode *)*MAXSIZE_STACK);
  37. if(!L->base) exit(0);
  38. L->top=0;
  39. }
  40. //入栈
  41. void Pushstack(BitNode *T,Stack *L)
  42. {
  43. L->base[L->top++]=T;
  44. }
  45. //出栈
  46. BitNode* Popstack(Stack *L)
  47. {
  48. return L->base[--L->top];
  49. }
  50. //入队
  51. void Push(Queue *Q,BitNode *T)
  52. {
  53. Q->base[Q->rear++]=T;
  54. }
  55. //出队
  56. BitNode* Pop(Queue *Q)
  57. {
  58. return (Q->base[Q->front++]);
  59. }
  60. //先序遍历法创建树
  61. void Creat_tree(BitNode **T)
  62. {
  63. char x;
  64. scanf("%c",&x);
  65. if(x=='#')*T=NULL;
  66. else
  67. {
  68. *T=(BitNode *)malloc(sizeof(BitNode));
  69. if(T==NULL) exit(-2);
  70. (*T)->data=x;
  71. Creat_tree(&(*T)->lchlid);
  72. Creat_tree(&(*T)->rchlid);
  73. }
  74. }
  75. /***********************
  76. 先序遍历
  77. ***********************/
  78. void Print1(BitNode *T)
  79. {
  80. if(T!=NULL)
  81. {
  82. printf("%c",T->data);
  83. Print1(T->lchlid);
  84. Print1(T->rchlid);
  85. }
  86. }
  87. /***********************
  88. 中序遍历
  89. ***********************/
  90. void Print2(BitNode *T)
  91. {
  92. if(T!=NULL)
  93. {
  94. Print2(T->lchlid);
  95. printf("%c",T->data);
  96. Print2(T->rchlid);
  97. }
  98. }
  99. /***********************
  100. 后序遍历
  101. ***********************/
  102. void Print3(BitNode *T)
  103. {
  104. if(T!=NULL)
  105. {
  106. Print3(T->lchlid);
  107. Print3(T->rchlid);
  108. printf("%c",T->data);
  109. }
  110. }
  111. /***********************
  112. 层序遍历
  113. ***********************/
  114. void Print4(BitNode *T)
  115. {
  116. Queue Q;
  117. InitQueue(&Q);
  118. Push(&Q,T);
  119. while(Q.front!=Q.rear)
  120. {
  121. printf("%c",Q.base[Q.front]->data);
  122. T=Pop(&Q);
  123. if(T->lchlid!=NULL)Push(&Q,T->lchlid);
  124. if(T->rchlid!=NULL)Push(&Q,T->rchlid);
  125. }
  126. }
  127. /***********************
  128. 非递归的先序遍历
  129. ***********************/
  130. void Print5(BitNode *T)
  131. {
  132. Stack L;
  133. InitStack(&L);
  134. while(T!=NULL || L.top!=0)
  135. {
  136. while(T!=NULL)
  137. {
  138. printf("%c",T->data);
  139. Pushstack(T,&L);
  140. T=T->lchlid;
  141. }
  142. if(L.top!=0)
  143. {
  144. T=Popstack(&L);
  145. T=T->rchlid;
  146. }
  147. }
  148. }
  149. /***********************
  150. 非递归的中序遍历
  151. ***********************/
  152. void Print6(BitNode *T)
  153. {
  154. Stack L;
  155. InitStack(&L);
  156. while(T!=NULL || L.top!=0)
  157. {
  158. while(T!=NULL)
  159. {
  160. Pushstack(T,&L);
  161. T=T->lchlid;
  162. }
  163. if(L.top!=0)
  164. {
  165. T=Popstack(&L);
  166. printf("%c",T->data);
  167. T=T->rchlid;
  168. }
  169. }
  170. }
  171. /***********************
  172. 非递归的后序遍历
  173. ***********************/
  174. void Print7(BitNode *T)
  175. {
  176. Stack L;
  177. InitStack(&L);
  178. while(T!=NULL || L.top!=0)
  179. {
  180. while(T!=NULL)
  181. {
  182. T->count=1;
  183. Pushstack(T,&L);
  184. T=T->lchlid;
  185. }
  186. if(L.top!=0)
  187. {
  188. T=Popstack(&L);
  189. if(T->count == 1)
  190. {
  191. T->count++;
  192. Pushstack(T,&L);
  193. T=T->rchlid;
  194. }
  195. else if(T->count == 2)
  196. {
  197. printf("%c",T->data);
  198. T=NULL;
  199. }
  200. }
  201. }
  202. }
  203. void main()
  204. {
  205. struct BitNode *T;
  206. printf("空以'#'号代替,如AB##CD##E##\n请输入二叉树:");
  207. Creat_tree(&T);
  208. printf("先序遍历:");
  209. Print1(T);
  210. printf("\n中序遍历:");
  211. Print2(T);
  212. printf("\n后序遍历:");
  213. Print3(T);
  214. printf("\n层序遍历:");
  215. Print4(T);
  216. printf("\n非递归先序遍历:");
  217. Print5(T);
  218. printf("\n非递归中序遍历:");
  219. Print6(T);
  220. printf("\n非递归后序遍历:");
  221. Print7(T);
  222. printf("\n");
  223. }

发表评论

表情:
评论列表 (有 0 条评论,225人围观)

还没有评论,来说两句吧...

相关阅读