当前位置:   article > 正文

二叉树的遍历方法(C语言)_二叉树的遍历c语言

二叉树的遍历c语言

前言:二叉树是一种基础的数据模型,学会遍历二叉树可以帮助我们解决很多问题,所以今天和大家讨论的是有关二叉树如何遍历的问题。

题目要求:完成二叉树的先序遍历,中序遍历,后序遍历的递归,非递归遍历,以及层次遍历,并计算树的高度。(从文件中读取,并以文件的形式输出)

二叉树示例(“#”代表空树)

 1.准备工作

#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode {
    char data;
    struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;                //BiTNode为结构体变量   BiTree为结构体指针

2.创建二叉树

BiTree CreateTree(FILE*fp_1) {
    BiTree T;
    char ch, trmp;
    fscanf(fp_1,"%c",&ch);
    if(ch=='#')
        T=NULL;
    else {
        T=(BiTNode*)malloc(sizeof(BiTNode));
        T->data=ch;
        T->lchild=CreateTree(fp_1);
        T->rchild=CreateTree(fp_1);
    }
    return T;
}

3.前序遍历(递归)

  1. void PreOrderTraverse(BiTree T) {
  2. if(T) {
  3. FILE*fp;
  4. fp=fopen("test_1.txt","a");
  5. fprintf(fp,"%c ",T->data);
  6. fclose(fp);
  7. PreOrderTraverse(T->lchild);
  8. PreOrderTraverse(T->rchild);
  9. }
  10. }

4.前序遍历(非递归)

  1. void PreOrderTraverse_1(BiTree T) {
  2. FILE*fp;
  3. BiTree stack[100],node;
  4. int top=0;
  5. if(T==NULL) {
  6. printf("tree is empty--\n");
  7. return ;
  8. } else {
  9. top++;
  10. stack[top]=T;
  11. while(top>0) {
  12. node=stack[top--];
  13. fp=fopen("test_1.txt","a");
  14. fprintf(fp,"%c ",node->data);
  15. fclose(fp);
  16. if(node->rchild!=NULL)
  17. stack[++top]=node->rchild;
  18. if(node->lchild!=NULL)
  19. stack[++top]=node->lchild;
  20. }
  21. }
  22. }

5.中序遍历(递归)

  1. void InOrderTraverse(BiTree T) {
  2. if(T) {
  3. FILE*fp;
  4. InOrderTraverse(T->lchild);
  5. fp=fopen("test_1.txt","a");
  6. fprintf(fp,"%c ",T->data);
  7. fclose(fp);
  8. InOrderTraverse(T->rchild);
  9. }
  10. }

6.中序遍历(非递归)

  1. void InOrderTraverse_1(BiTree T) {
  2. BiTree stack[100],node;
  3. int top=0;
  4. FILE*fp;
  5. if(T==NULL) {
  6. printf("tree is empty--\n");
  7. return ;
  8. }
  9. node=T;
  10. while(node!=NULL||top>0) {
  11. while(node!=NULL) {
  12. stack[++top]=node;
  13. node=node->lchild;
  14. }
  15. node=stack[top--]; //出栈
  16. fp=fopen("test_1.txt","a");
  17. fprintf(fp,"%c ",node->data);
  18. fclose(fp);
  19. node=node->rchild;
  20. }
  21. }

7.后序遍历(递归)

  1. void PostOrderTraverse(BiTree T) {
  2. if(T) {
  3. FILE*fp;
  4. PostOrderTraverse(T->lchild);
  5. PostOrderTraverse(T->rchild);
  6. fp=fopen("test_1.txt","a");
  7. fprintf(fp,"%c ",T->data);
  8. fclose(fp);
  9. }
  10. }

8.后序遍历(非递归)

  1. void PostOrderTraverse_1(BiTree T) {
  2. BiTree p=T,stack[100],have_visited=NULL;
  3. int num=0;
  4. FILE*fp;
  5. while(p!=NULL||num>0){
  6. while(p!=NULL){
  7. stack[num++]=p;
  8. p=p->lchild;
  9. }
  10. p=stack[num-1];
  11. if(p->rchild==NULL||p->rchild==have_visited){ //要么右子树为空,要么右子树已经被访问
  12. fp=fopen("test_1.txt","a");
  13. fprintf(fp,"%c ",p->data);
  14. fclose(fp);
  15. num--;
  16. have_visited=p;
  17. p=NULL;
  18. }
  19. else
  20. p=p->rchild;
  21. }
  22. }

9.层次遍历 

  1. void level(BiTree T) {
  2. FILE*fp;
  3. BiTree queue[20],pTemp;
  4. int cur=0,pre=0; //队列中cur是队尾,pre是队头
  5. queue[cur++]=T;
  6. while(cur!=pre) {
  7. pTemp=queue[pre++]; //出队列
  8. fp=fopen("test_1.txt","a");
  9. fprintf(fp,"%c ",pTemp->data);
  10. fclose(fp);
  11. if(pTemp->lchild!=NULL)
  12. queue[cur++]=pTemp->lchild; //入队列
  13. if(pTemp->rchild!=NULL)
  14. queue[cur++]=pTemp->rchild; //入队列
  15. }
  16. }

10.树的高度

  1. int height(BiTree T) { //树的高度
  2. int ld,rd;
  3. if(T==NULL)
  4. return 0;
  5. else {
  6. ld=height(T->lchild);
  7. rd=height(T->rchild);
  8. return 1+(ld>rd?ld:rd);
  9. }
  10. }

总代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct BiTNode {
  4. char data;
  5. struct BiTNode *lchild,*rchild;
  6. } BiTNode,*BiTree; //BiTNode为结构体变量 BiTree为结构体指针
  7. BiTree CreateTree(FILE*fp_1) {
  8. BiTree T;
  9. char ch, trmp;
  10. fscanf(fp_1,"%c",&ch);
  11. if(ch=='#')
  12. T=NULL;
  13. else {
  14. T=(BiTNode*)malloc(sizeof(BiTNode));
  15. T->data=ch;
  16. T->lchild=CreateTree(fp_1);
  17. T->rchild=CreateTree(fp_1);
  18. }
  19. return T;
  20. }
  21. void InOrderTraverse(BiTree T) {
  22. if(T) {
  23. FILE*fp;
  24. InOrderTraverse(T->lchild);
  25. fp=fopen("test_1.txt","a");
  26. fprintf(fp,"%c ",T->data);
  27. fclose(fp);
  28. InOrderTraverse(T->rchild);
  29. }
  30. }
  31. void PreOrderTraverse(BiTree T) {
  32. if(T) {
  33. FILE*fp;
  34. fp=fopen("test_1.txt","a");
  35. fprintf(fp,"%c ",T->data);
  36. fclose(fp);
  37. PreOrderTraverse(T->lchild);
  38. PreOrderTraverse(T->rchild);
  39. }
  40. }
  41. void PostOrderTraverse(BiTree T) {
  42. if(T) {
  43. FILE*fp;
  44. PostOrderTraverse(T->lchild);
  45. PostOrderTraverse(T->rchild);
  46. fp=fopen("test_1.txt","a");
  47. fprintf(fp,"%c ",T->data);
  48. fclose(fp);
  49. }
  50. }
  51. void InOrderTraverse_1(BiTree T) {
  52. BiTree stack[100],node;
  53. int top=0;
  54. FILE*fp;
  55. if(T==NULL) {
  56. printf("tree is empty--\n");
  57. return ;
  58. }
  59. node=T;
  60. while(node!=NULL||top>0) {
  61. while(node!=NULL) {
  62. stack[++top]=node;
  63. node=node->lchild;
  64. }
  65. node=stack[top--]; //出栈
  66. fp=fopen("test_1.txt","a");
  67. fprintf(fp,"%c ",node->data);
  68. fclose(fp);
  69. node=node->rchild;
  70. }
  71. }
  72. void PreOrderTraverse_1(BiTree T) {
  73. FILE*fp;
  74. BiTree stack[100],node;
  75. int top=0;
  76. if(T==NULL) {
  77. printf("tree is empty--\n");
  78. return ;
  79. } else {
  80. top++;
  81. stack[top]=T;
  82. while(top>0) {
  83. node=stack[top--];
  84. fp=fopen("test_1.txt","a");
  85. fprintf(fp,"%c ",node->data);
  86. fclose(fp);
  87. if(node->rchild!=NULL)
  88. stack[++top]=node->rchild;
  89. if(node->lchild!=NULL)
  90. stack[++top]=node->lchild;
  91. }
  92. }
  93. }
  94. void PostOrderTraverse_1(BiTree T) {
  95. BiTree p=T,stack[100],have_visited=NULL;
  96. int num=0;
  97. FILE*fp;
  98. while(p!=NULL||num>0){
  99. while(p!=NULL){
  100. stack[num++]=p;
  101. p=p->lchild;
  102. }
  103. p=stack[num-1];
  104. if(p->rchild==NULL||p->rchild==have_visited){ //要么右子树为空,要么右子树已经被访问
  105. fp=fopen("test_1.txt","a");
  106. fprintf(fp,"%c ",p->data);
  107. fclose(fp);
  108. num--;
  109. have_visited=p;
  110. p=NULL;
  111. }
  112. else
  113. p=p->rchild;
  114. }
  115. }
  116. void level(BiTree T) {
  117. FILE*fp;
  118. BiTree queue[20],pTemp;
  119. int cur=0,pre=0; //队列中cur是队尾,pre是队头
  120. queue[cur++]=T;
  121. while(cur!=pre) {
  122. pTemp=queue[pre++]; //出队列
  123. fp=fopen("test_1.txt","a");
  124. fprintf(fp,"%c ",pTemp->data);
  125. fclose(fp);
  126. if(pTemp->lchild!=NULL)
  127. queue[cur++]=pTemp->lchild; //入队列
  128. if(pTemp->rchild!=NULL)
  129. queue[cur++]=pTemp->rchild; //入队列
  130. }
  131. }
  132. int height(BiTree T) { //树的高度
  133. int ld,rd;
  134. if(T==NULL)
  135. return 0;
  136. else {
  137. ld=height(T->lchild);
  138. rd=height(T->rchild);
  139. return 1+(ld>rd?ld:rd);
  140. }
  141. }
  142. int main() {
  143. BiTree T;
  144. FILE*fp_1;
  145. fp_1=fopen("test_2.txt","r");
  146. T=CreateTree(fp_1);
  147. fclose(fp_1);
  148. FILE*fp;
  149. fp=fopen("test_1.txt","w");
  150. fprintf(fp,"先序遍历:");
  151. fclose(fp);
  152. PreOrderTraverse(T);
  153. fp=fopen("test_1.txt","a");
  154. fprintf(fp,"\n");
  155. fclose(fp);
  156. fp=fopen("test_1.txt","a");
  157. fprintf(fp,"中序遍历:");
  158. fclose(fp);
  159. InOrderTraverse(T);
  160. fp=fopen("test_1.txt","a");
  161. fprintf(fp,"\n");
  162. fclose(fp);
  163. fp=fopen("test_1.txt","a");
  164. fprintf(fp,"后序遍历:");
  165. fclose(fp);
  166. PostOrderTraverse(T);
  167. fp=fopen("test_1.txt","a");
  168. fprintf(fp,"\n");
  169. fclose(fp);
  170. fp=fopen("test_1.txt","a");
  171. fprintf(fp,"非递归先序遍历:");
  172. fclose(fp);
  173. PreOrderTraverse_1(T);
  174. fp=fopen("test_1.txt","a");
  175. fprintf(fp,"\n");
  176. fclose(fp);
  177. fp=fopen("test_1.txt","a");
  178. fprintf(fp,"非递归中序遍历:");
  179. fclose(fp);
  180. InOrderTraverse_1(T);
  181. fp=fopen("test_1.txt","a");
  182. fprintf(fp,"\n");
  183. fclose(fp);
  184. fp=fopen("test_1.txt","a");
  185. fprintf(fp,"非递归后序遍历:");
  186. fclose(fp);
  187. PostOrderTraverse_1(T);
  188. fp=fopen("test_1.txt","a");
  189. fprintf(fp,"\n");
  190. fclose(fp);
  191. fp=fopen("test_1.txt","a");
  192. fprintf(fp,"层次遍历:");
  193. fclose(fp);
  194. level(T);
  195. fp=fopen("test_1.txt","a");
  196. fprintf(fp,"\n二叉树的高度为:%d\n",height(T));
  197. fclose(fp);
  198. return 0;
  199. }

输入样例

 输出样例

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/716008
推荐阅读
相关标签
  

闽ICP备14008679号