Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. //
  2. // Created by 方朋 on 2017/1/4.
  3. //
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. #define OK 1
  9. #define ERROR 0
  10.  
  11. typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
  12. typedef char TElemType;
  13. TElemType Nil = ' '; // 字符型以空格为空
  14.  
  15. typedef struct BiTNode // 结点结构
  16. {
  17. TElemType data; // 结点数据
  18. struct BiTNode *lchild, *rchild; // 左右孩子指针
  19. }BiTNode, *BiTree;
  20.  
  21. /* 构造空二叉树T */
  22. Status InitBiTree(BiTree *T)
  23. {
  24. *T=NULL;
  25. return OK;
  26. }
  27.  
  28. /* 按前序输入二叉树中结点的值(一个字符) */
  29. /* #表示空树,构造二叉链表表示二叉树T。 */
  30. /* 大话数据结构树: C6.9 小结 */
  31. void CreateBiTree(BiTree *T)
  32. {
  33. TElemType ch;
  34. scanf ("%c", &ch);
  35. if (ch == '#')
  36. *T = NULL;
  37. else
  38. {
  39. *T = (BiTree)malloc (sizeof (struct BiTNode));
  40. if(!*T)
  41. exit (2);
  42. (*T)->data = ch; // 生成根结点
  43. CreateBiTree (&(*T)->lchild); // 构造左子树
  44. CreateBiTree (&(*T)->rchild); // 构造右子树
  45. }
  46. }
  47.  
  48. int BiTreeEmpty (BiTree T)
  49. {
  50. return T ? 0 : 1;
  51. }
  52.  
  53. int BiTreeDepth(BiTree T)
  54. {
  55. int i, j;
  56. if (!T) return 0;
  57.  
  58. i = T->lchild ? BiTreeEmpty (T->lchild) : 0;
  59. j = T->rchild ? BiTreeEmpty (T->rchild) : 0;
  60. return i > j ? i+1 : j+1;
  61. }
  62.  
  63. TElemType Root(BiTree T)
  64. {
  65. return T ? T->data : Nil;
  66. }
  67.  
  68. void PreOrderTraverse(BiTree T)
  69. {
  70. if (T == NULL) return;
  71. printf ("%c", T->data);
  72. PreOrderTraverse (T->lchild);
  73. PreOrderTraverse (T->rchild);
  74. }
  75.  
  76. void InOrderTraverse(BiTree T)
  77. {
  78. if (T == NULL) return;
  79. PreOrderTraverse (T->lchild);
  80. printf ("%c", T->data);
  81. PreOrderTraverse (T->rchild);
  82. }
  83.  
  84. void PostOrderTraverse(BiTree T)
  85. {
  86. if (T == NULL) return;
  87. PreOrderTraverse (T->lchild);
  88. PreOrderTraverse (T->rchild);
  89. printf ("%c", T->data);
  90. }
  91.  
  92. /* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */
  93. void DestroyBiTree(BiTree *T)
  94. {
  95. if (*T)
  96. {
  97. if ((*T)->lchild) // 如有左孩子则递归销毁左孩子
  98. DestroyBiTree (&(*T)->lchild);
  99.  
  100. if ((*T)->rchild) // 如有右孩子则递归销毁右孩子
  101. DestroyBiTree (&(*T)->lchild);
  102.  
  103. free (*T); // 释放根结点
  104. *T = NULL; // 空指针赋null
  105. }
  106.  
  107. }
  108.  
  109. #define ClearBiTree DestroyBiTree
  110.  
  111.  
  112. int main()
  113. {
  114. int i;
  115. BiTree T;
  116. TElemType e1;
  117.  
  118. InitBiTree(&T);
  119.  
  120. CreateBiTree(&T);
  121. printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));
  122.  
  123. e1=Root(T);
  124. printf("二叉树的根为: %c\n",e1);
  125.  
  126. printf("\n前序遍历二叉树:");
  127. PreOrderTraverse(T);
  128. printf("\n中序遍历二叉树:");
  129. InOrderTraverse(T);
  130. printf("\n后序遍历二叉树:");
  131. PostOrderTraverse(T);
  132.  
  133. ClearBiTree(&T);
  134. printf("\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));
  135. i=Root(T);
  136. if(!i)
  137. printf("树空,无根\n");
  138.  
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement