歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 二叉樹順序表示的實現(C語言)

二叉樹順序表示的實現(C語言)

日期:2017/3/1 10:07:55   编辑:Linux編程

二叉樹順序表示的實現(C語言)

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #define OK 1
  5. #define ERROR 0
  6. #define TRUE 1
  7. #define FALSE 0
  8. #define MAX_TREE_SIZE 100
  9. typedef char seq_bitree[MAX_TREE_SIZE]; //可以把seq_bitree當做一個數據類型用了
  10. char nil = ' '; //字符型節點設' '為空節點
  11. int (*visit_fun)(char);
  12. struct position
  13. {
  14. int level;
  15. int order;
  16. };
  17. /*
  18. 初始化二叉樹,結點值賦為nil
  19. */
  20. void init_seq_bitree(seq_bitree tree)
  21. {
  22. int i = 0;
  23. for(i = 0; i < MAX_TREE_SIZE; i++)
  24. {
  25. tree[i] = nil;
  26. }
  27. return ;
  28. }
  29. /*
  30. 根據輸入的層序str_tree,創建二叉樹
  31. */
  32. void create_seq_bitree(seq_bitree tree, char *str_tree)
  33. {
  34. int i = 0;
  35. int len = 0;
  36. len = strlen(str_tree);
  37. for(i = 0; i < len; i++)
  38. {
  39. if(str_tree[i] == 0)
  40. {
  41. tree[i] = nil;
  42. }
  43. else
  44. {
  45. tree[i] = str_tree[i];
  46. }
  47. if((i != 0) && (tree[(i + 1) / 2 - 1] == nil) && (tree[i] != nil))
  48. {
  49. printf("出現了無父節點的非根節點!\n");
  50. exit(ERROR);
  51. }
  52. }
  53. for(i = len; i < MAX_TREE_SIZE; i++) //將剩余的部分置為空節點
  54. {
  55. tree[i] = nil;
  56. }
  57. return ;
  58. }
  59. /*
  60. 功能: 判斷二叉樹是否為空
  61. 返回: TRUE 為空;FLASE 非空
  62. */
  63. int is_bitree_empty(seq_bitree tree)
  64. {
  65. if(tree[0] == nil)
  66. {
  67. return TRUE;
  68. }
  69. else
  70. {
  71. return ERROR;
  72. }
  73. }
  74. /*
  75. 獲取二叉樹的深度
  76. */
  77. int get_bitree_depth(seq_bitree tree)
  78. {
  79. int i = 0;
  80. int depth = 0;
  81. for(i = (MAX_TREE_SIZE - 1); i >= 0; i--)
  82. {
  83. if(tree[i] != nil)
  84. {
  85. break;
  86. }
  87. }
  88. do
  89. {
  90. depth++;
  91. }while(i >= (int)pow(2, depth));
  92. return depth;
  93. }
  94. /*供preorder_traverse調用*/
  95. void pre_traverse(seq_bitree tree, int index)
  96. {
  97. visit_fun(tree[index]);
  98. if(tree[2 * index + 1] != nil)
  99. {
  100. pre_traverse(tree, (2 * index + 1));
  101. }
  102. if(tree[2 * index + 2] != nil)
  103. {
  104. pre_traverse(tree, (2 * index + 2));
  105. }
  106. }
  107. /*
  108. 先序遍歷二叉樹
  109. */
  110. int preorder_traverse(seq_bitree tree, int (*visit)(char))
  111. {
  112. visit_fun = visit;
  113. if(is_bitree_empty(tree))
  114. {
  115. printf("the tree is empty.\n");
  116. }
  117. pre_traverse(tree, 0);
  118. return OK;
  119. }
  120. /*供inorder_traverse調用*/
  121. void in_traverse(seq_bitree tree, int index)
  122. {
  123. if(tree[2 * index + 1] != nil)
  124. {
  125. in_traverse(tree, (2 * index + 1));
  126. }
  127. visit_fun(tree[index]);
  128. if(tree[2 * index + 2] != nil)
  129. {
  130. in_traverse(tree, (2 * index + 2));
  131. }
  132. }
  133. /*
  134. 中序遍歷二叉樹
  135. */
  136. int inorder_traverse(seq_bitree tree, int (*visit)(char))
  137. {
  138. visit_fun = visit;
  139. if(is_bitree_empty(tree))
  140. {
  141. printf("the tree is empty.\n");
  142. }
  143. in_traverse(tree, 0);
  144. return OK;
  145. }
  146. /*供postorder_traverse調用*/
  147. void post_traverse(seq_bitree tree, int index)
  148. {
  149. if(tree[2 * index + 1] != nil)
  150. {
  151. post_traverse(tree, (2 * index + 1));
  152. }
  153. if(tree[2 * index + 2] != nil)
  154. {
  155. post_traverse(tree, (2 * index + 2));
  156. }
  157. visit_fun(tree[index]);
  158. }
  159. /*
  160. 後序遍歷二叉樹
  161. */
  162. int postorder_traverse(seq_bitree tree, int (*visit)(char))
  163. {
  164. visit_fun = visit;
  165. if(is_bitree_empty(tree))
  166. {
  167. printf("the tree is empty.\n");
  168. }
  169. post_traverse(tree, 0);
  170. return OK;
  171. }
  172. /*
  173. 按層遍歷二叉樹
  174. */
  175. int level_order_traverse(seq_bitree tree, int (*visit)(char))
  176. {
  177. int i = MAX_TREE_SIZE - 1;
  178. int j = 0;
  179. visit_fun = visit;
  180. if(is_bitree_empty(tree))
  181. {
  182. printf("the tree is empty.\n");
  183. return OK;
  184. }
  185. while(tree[i] != nil)
  186. {
  187. i--;
  188. }
  189. for(j = 0; j <+ i; j++)
  190. {
  191. if(tree[j] == nil) //不存在的結點不打印
  192. {
  193. continue;
  194. }
  195. visit_fun(tree[j]);
  196. }
  197. printf("\n");
  198. return OK;
  199. }
  200. int visit(char e)
  201. {
  202. printf("%c ", e);
  203. return OK;
  204. }
  205. int main(int argc, char *argv[])
  206. {
  207. seq_bitree tree;
  208. char str_tree[MAX_TREE_SIZE] = "abcde fg";
  209. //測試數據,假設二叉樹層序遍歷如上(' '表示該處無節點)
  210. init_seq_bitree(tree);
  211. create_seq_bitree(tree, str_tree);
  212. if(is_bitree_empty(tree))
  213. {
  214. printf("the bitree is empty.\n");
  215. return 0;
  216. }
  217. printf("the depth of the bitree is %d\n", get_bitree_depth(tree));
  218. printf("先序遍歷二叉樹:\n");
  219. preorder_traverse(tree, visit);
  220. printf("\n中序遍歷二叉樹:\n");
  221. inorder_traverse(tree, visit);
  222. printf("\n後序遍歷二叉樹:\n");
  223. postorder_traverse(tree, visit);
  224. printf("\n按層遍歷二叉樹:\n");
  225. level_order_traverse(tree, visit);
  226. return 0;
  227. }
Copyright © Linux教程網 All Rights Reserved