Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45217
  • 博文数量: 44
  • 博客积分: 50
  • 博客等级: 民兵
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-16 06:05
文章分类

全部博文(44)

文章存档

2012年(32)

2011年(12)

我的朋友

分类:

2012-06-23 11:05:44

原文地址:二叉树 作者:何本俊夫


点击(此处)折叠或打开

  1. /*
  2.  *二叉树采用二叉链表结构表示。设计并实现如下算法:
  3.  *后序递归建树,先序非递归遍历该树。
  4.  */
  5. #include <stdio.h>
  6. #include <stdlib.h>

  7. #define ERROR 0
  8. #define OK 1
  9. #define OVERFLOW 0
  10. #define STACK_INIT_SIZE 100
  11. #define STACKINCREMENT 100

  12. typedef char TElemType;
  13. typedef struct BiTNode {
  14.     TElemType data;
  15.     struct BiTNode *lchild, *rchild;
  16. }BiTNode, *BiTree;

  17. typedef BiTree ElemType;
  18. typedef struct {
  19.     ElemType *base;
  20.     ElemType *top;
  21.     int stacksize;
  22. }SqStack;

  23. int InitStack (SqStack *S)
  24. {
  25.     S->base=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  26.     if (!S->base)
  27.          exit (OVERFLOW);
  28.     S->top=S->base;
  29.     S->stacksize=STACK_INIT_SIZE;
  30.     return OK;
  31. }

  32. int StackEmpty (SqStack S)
  33. {
  34.     if (S.base==S.top)
  35.         return 1;
  36.     else
  37.         return 0;
  38. }

  39. int Push (SqStack *S, ElemType e)
  40. {
  41.     if (S->top - S->base >= S->stacksize)
  42.     {
  43.         S->base=(ElemType *)realloc(S->base,
  44.                               (S->stacksize + STACKINCREMENT)* sizeof(ElemType));
  45.         if (!S->base)
  46.             exit (OVERFLOW);
  47.         S->top=S->base+S->stacksize;
  48.         S->stacksize+=STACKINCREMENT;
  49.     }
  50.     *S->top++ = e;
  51.     return OK;
  52. }

  53. int Pop(SqStack *S,ElemType *e)
  54. {
  55.     if (S->top==S->base)
  56.         return ERROR;
  57.     *e=*(--S->top);
  58.     return OK;
  59. }

  60. void CreateBiTree (BiTree *T)
  61. {
  62.     TElemType temp;
  63.     scanf ("%c", &temp);
  64.     if (temp==' ')
  65.     {
  66.         *T=NULL;
  67.     }
  68.     else
  69.     {
  70.         if (!((*T)=(BiTree)malloc(sizeof(BiTNode))))
  71.             exit (1);
  72.         CreateBiTree (&((*T)->lchild));
  73.         CreateBiTree (&((*T)->rchild));
  74.         (*T)->data=temp;
  75.     }
  76. }

  77. void Traverse (BiTree T)
  78. {
  79.     BiTree P;
  80.     SqStack S;
  81.     InitStack (&S);
  82.     P=T;
  83.     while (P||!StackEmpty(S))
  84.     {
  85.         if (P)
  86.         {
  87.             printf ("%c", P->data);
  88.             Push(&S,P);
  89.             P=P->lchild;
  90.         }
  91.         else
  92.         {
  93.             Pop(&S,&P);
  94.             P=P->rchild;
  95.         }
  96.     }
  97. }

  98. int main ()
  99. {
  100.     BiTree T;
  101.     CreateBiTree (&T);
  102.     printf ("\n");
  103.     Traverse (T);
  104.     printf ("\n");
  105.     printf ("end");
  106.     getch ();
  107.     return 0;
  108. }

点击(此处)折叠或打开

  1. /* 二叉树采用二叉链表结构表示。设计并实现如下算法:
  2. * 输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树
  3. */

  4. #include
  5. #include
  6. #include

  7. #define ERROR 0
  8. #define OK 1
  9. #define OVERFLOW 0
  10. #define STACK_INIT_SIZE 100
  11. #define STACKINCREMENT 100
  12. #define MAXQSIZE 100
  13. typedef char TElemType;
  14. typedef struct BiTNode {
  15. TElemType data;
  16. struct BiTNode *lchild, *rchild;
  17. }BiTNode, *BiTree;

  18. typedef BiTree ElemType;
  19. typedef struct {
  20. ElemType *base;
  21. ElemType *top;
  22. int stacksize;
  23. }SqStack;

  24. typedef struct {
  25. ElemType *base;
  26. int front;
  27. int rear;
  28. }SqQueue;

  29. void InitQueue (SqQueue *Q)
  30. {
  31. Q->base=(ElemType *)malloc(MAXQSIZE * sizeof(ElemType));
  32. if (!Q->base)
  33. exit (0);
  34. Q->front=0;
  35. Q->rear=0;
  36. }

  37. int QueueLength (SqQueue Q)
  38. {
  39. return (Q.rear-Q.front+MAXQSIZE) % MAXQSIZE;
  40. }

  41. void EnQueue (SqQueue *Q, ElemType e)
  42. {
  43. if ((Q->rear+1)%MAXQSIZE==Q->front)
  44. return;
  45. Q->base[Q->rear]=e;
  46. Q->rear=(Q->rear+1)%MAXQSIZE;
  47. }

  48. void DeQueue (SqQueue *Q, ElemType *e)
  49. {
  50. if (Q->front==Q->rear)
  51. return;
  52. *e=Q->base[Q->front];
  53. Q->front=(Q->front+1)%MAXQSIZE;
  54. }

  55. int InitStack (SqStack *S)
  56. {
  57. S->base=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  58. if (!S->base)
  59. exit (OVERFLOW);
  60. S->top=S->base;
  61. S->stacksize=STACK_INIT_SIZE;
  62. return OK;
  63. }

  64. int StackEmpty (SqStack S)
  65. {
  66. if (S.base==S.top)
  67. return 1;
  68. else
  69. return 0;
  70. }

  71. int Push (SqStack *S, ElemType e)
  72. {
  73. if (S->top - S->base >= S->stacksize)
  74. {
  75. S->base=(ElemType *)realloc(S->base,
  76. (S->stacksize + STACKINCREMENT)* sizeof(ElemType));
  77. if (!S->base)
  78. exit (OVERFLOW);
  79. S->top=S->base+S->stacksize;
  80. S->stacksize+=STACKINCREMENT;
  81. }
  82. *S->top++ = e;
  83. return OK;
  84. }

  85. int Pop(SqStack *S,ElemType *e)
  86. {
  87. if (S->top==S->base)
  88. return ERROR;
  89. *e=*(--S->top);
  90. return OK;
  91. }

  92. void Create (BiTree *T)
  93. {
  94. char temp;
  95. BiTree P=NULL,Q=NULL;
  96. SqStack S;
  97. int status=0;
  98. *T=NULL;
  99. InitStack (&S);
  100. scanf ("%c",&temp);
  101. while (temp!='#')
  102. {
  103. switch (temp) {
  104. case '(' :
  105. status=1; //准备处理左子树
  106. if (P!=NULL)
  107. Push (&S,P);
  108. break;
  109. case ')' :
  110. Pop (&S,&P);
  111. break;
  112. case ',' :
  113. status=2;
  114. break;
  115. default :
  116. P=(BiTree)malloc(sizeof(BiTNode));
  117. P->data=temp;
  118. P->lchild=NULL;
  119. P->rchild=NULL;
  120. if (*T==NULL)
  121. *T=P;
  122. else
  123. {
  124. if (status==1)
  125. {
  126. Pop (&S,&Q);
  127. Q->lchild=P;
  128. Push (&S,Q);
  129. }
  130. else if (status==2)
  131. {
  132. Pop (&S,&Q);
  133. Q->rchild=P;
  134. Push (&S,Q);
  135. }
  136. }
  137. }
  138. scanf ("%c",&temp);
  139. }
  140. }

  141. void Traverse (BiTree T)
  142. {
  143. SqQueue Q;
  144. BiTree P;
  145. InitQueue (&Q);
  146. P=T;
  147. EnQueue (&Q, T);
  148. while (QueueLength (Q)!=0)
  149. {
  150. DeQueue (&Q, &P);
  151. printf ("%c", P->data);
  152. if (P->lchild!=NULL)
  153. EnQueue (&Q, P->lchild);
  154. if (P->rchild!=NULL)
  155. EnQueue (&Q, P->rchild);
  156. }
  157. }

  158. int main ()
  159. {
  160. BiTree T;
  161. Create (&T);
  162. Traverse (T);
  163. system ("pause");
  164. return 0;
  165. }

阅读(268) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~