歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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

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