Cpp1.cpp
上传用户:hzhdmaoyi
上传日期:2022-07-30
资源大小:1k
文件大小:3k
源码类别:

数据结构

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h> 
  4. #define MaxSize 100 //空间上限
  5. typedef char ElemType;//数据单元定义为字符型
  6. typedef struct node//标准二叉树型结构
  7. { ElemType data;
  8. struct node *lchild;
  9. struct node *rchild;
  10. }BiTNode;
  11. void CreateBiTNode(BiTNode *&b)//创建树
  12. {
  13. BiTNode *St[MaxSize],*p=NULL;
  14. int top=-1,k,j=0,a;
  15. char ch0,ch;
  16. char str[MaxSize];
  17. b=NULL;
  18.     printf("请输入一个格式为A(B,C)的二叉树:n以#结束n");
  19. ch0=getchar();
  20. for(a=0;ch0!='#';a++){
  21. str[a]=ch0;
  22. ch0=getchar();
  23. }
  24. ch=str[j];
  25. while(ch!='#')
  26. {
  27. switch(ch)
  28. {
  29. case'(':top++;St[top]=p;k=1;break;
  30. case')':top--;break;
  31. case',':k=2;break;
  32. default:p=(BiTNode *)malloc(sizeof(BiTNode));
  33. p->data=ch;p->lchild=p->rchild=NULL;
  34. if(b==NULL)
  35. b=p;
  36. else
  37. { switch(k)
  38. {
  39. case 1:St[top]->lchild=p;break;
  40. case 2:St[top]->rchild=p;break;
  41. }
  42. }
  43. }
  44. j++;
  45. ch=str[j];
  46. }
  47. }
  48. void DispBiTNode(BiTNode *b)//由上至下深度遍历输出树
  49. {
  50. if(b!=NULL)
  51. { printf("%c",b->data);
  52. if (b->lchild!=NULL||b->rchild!=NULL)
  53. { printf("(");
  54. DispBiTNode(b->lchild);
  55. if (b->rchild!=NULL)printf(",");
  56. DispBiTNode(b->rchild);
  57. printf(")");
  58. }
  59. }
  60. }
  61. void Path(BiTNode *b,ElemType path[],int pathlen)//倒序导出路径
  62. {
  63. int i;
  64. if (b!=NULL)
  65. if(b->lchild==NULL&&b->rchild==NULL)
  66. printf("%c到根结点路径:%c",b->data,b->data);
  67.     for(i=pathlen-1;i>=0;i--)
  68.   printf("%c",path[i]);
  69.     printf("n");
  70. }
  71. else
  72. path[pathlen]=b->data;
  73.     pathlen++;
  74.     Path(b->lchild,path,pathlen);
  75.     Path(b->rchild,path,pathlen);
  76.     pathlen--;
  77. }
  78. }
  79. }
  80. void Path0(BiTNode *b,ElemType path[],int pathlen)//正序导出路径
  81. {
  82. int i;
  83. if (b!=NULL)
  84. {
  85.   if (b->lchild!=NULL&&b->rchild!=NULL)
  86.         path[pathlen]=b->data;
  87. pathlen++;
  88. Path0(b->lchild,path,pathlen);
  89. Path0(b->rchild,path,pathlen);
  90. }
  91.   else 
  92.   {     printf("从根节点到子结点的路径:");    
  93.     for(i=0;i<=pathlen-1;i++)
  94.     printf("%c",path[i]);
  95.         printf("%c",b->data);
  96. printf("n"); 
  97.   }
  98. }
  99. }
  100. void FroutBiTNode(BiTNode *b)//前序遍历输出,非递归
  101. {
  102.   BiTNode *code[MaxSize],*t;
  103.   t=b;
  104.   int tot=0;
  105.   code[0]=b;
  106. while (t!=NULL||tot!=-1)
  107.   {
  108.     while (t!=NULL)
  109. { if (t!=b)  tot++; 
  110.   code[tot]=t;
  111.   printf("%c",t->data);
  112.   t=t->lchild;
  113. }
  114.     t=code[tot];
  115. t=t->rchild;
  116. tot--;
  117.   }
  118. }
  119. void main()
  120. {   
  121. BiTNode*b;
  122. ElemType path[MaxSize];
  123. int i=0;
  124. CreateBiTNode(b);
  125. printf("二叉树b:");
  126. DispBiTNode(b);
  127. printf("n");
  128. Path(b,path,0);
  129. Path0(b,path,0);
  130. printf("输出前序遍历结果:");
  131. FroutBiTNode(b);
  132. }