1. 程式人生 > >[數據結構與算法] : 二叉查找樹

[數據結構與算法] : 二叉查找樹

one while space pan amp 二叉 查找 fine arc

頭文件

 1 typedef int ElementType;
 2 #ifndef _TREE_H_
 3 #define _TREE_H_
 4 
 5 struct TreeNode;
 6 typedef struct TreeNode *Position;
 7 typedef struct TreeNode *SearchTree;
 8 
 9 SearchTree MakeEmpty(SearchTree T);
10 Position Find(ElementType X, SearchTree T);
11 Position FindMin(SearchTree T);
12 Position FindMin2(SearchTree T); 13 Position FindMax2(SearchTree T); 14 SearchTree Insert(ElementType X, SearchTree T); 15 SearchTree Delete(ElementType X, SearchTree T); 16 ElementType Retrieve(Position P); 17 18 #endif

源文件

  1 #include "tree.h"
  2 #include "fatal.h"
  3 #include <malloc
.h> 4 5 struct TreeNode 6 { 7 ElementType Element; 8 SearchTree Left; 9 SearchTree Right; 10 }; 11 12 // 先清空左子樹, 再清空又子樹, 再釋放自身節點 13 SearchTree MakeEmpty(SearchTree T) 14 { 15 if(T != NULL) 16 { 17 MakeEmpty(T->Left); 18 MakeEmpty(T->Right);
19 free(T); 20 } 21 return NULL; // 遞歸終止條件 22 } 23 24 // 查找, 類似二分查找 25 Position Find(ElementType X, SearchTree T) 26 { 27 if(T == NULL) // 遞歸終止條件 28 return NULL; 29 if(X < T->Element) 30 return Find(X, T->Left); 31 else if(X > T->Element) 32 return Find(X, T->Right); 33 else 34 return T; 35 } 36 37 Position FindMin(SearchTree T) // 遞歸實現 38 { 39 if(T == NULL) // 防止非法輸入 40 return NULL; 41 if(T->Left == NULL) // 遞歸終止 42 return T; 43 else 44 return FindMin(T->Left); 45 } 46 47 Position FindMin2(SearchTree T) // 非遞歸實現 48 { 49 if(T == NULL) 50 return NULL; 51 while(T->Left != NULL) 52 T = T->Left; 53 return T; 54 } 55 56 Position FindMax(SearchTree T) 57 { 58 if(T == NULL) 59 return NULL; 60 if(T->Right == NULL) 61 return T; 62 else 63 return FindMax(T->Right); 64 } 65 66 Position FindMax2(SearchTree T) 67 { 68 if(T == NULL) 69 return NULL; 70 while(T->Right != NULL) 71 T = T->Right; 72 return T; 73 } 74 75 // 插入 76 SearchTree Insert(ElementType X, SearchTree T) 77 { 78 if(T == NULL) // 如果T為NULL, 創建節點, 遞歸終止條件 79 { 80 T = (SearchTree)malloc(sizeof(struct TreeNode)); 81 if(T == NULL) 82 FatalError("Out of space!"); 83 else 84 { 85 T->Element = X; 86 T->Left = T->Right = NULL; 87 } 88 } 89 else if(X < T->Element) 90 T->Left = Insert(X, T->Left); 91 else if(X > T->Element) 92 T->Right = Insert(X, T->Right); 93 // 如果X已經在數中, 則什麽也不做 94 return T; // Do not forget this line!! 95 } 96 97 // 刪除 98 SearchTree Delete(ElementType X, SearchTree T) 99 { 100 Position TempCell; 101 if(T == NULL) // 遞歸終止 102 Error("Element not found!"); 103 else if(X < T->Element) 104 T->Left = Delete(X, T->Left); 105 else if(X > T->Element) 106 T->Right = Delete(X, T->Right); 107 else if(T->Left && T->Right) // Two children 108 { 109 TempCell = FindMin(T->Right);// 找一個替身, 右子樹的最小值 110 T->Element = TempCell->Element; 111 T->Right = Delete(T->Element, T->Right);// 替身已經放到T->Element, 再從右子樹刪除該值即可 112 } 113 else // One or zero childern 114 { 115 TempCell = T; 116 if(T->Left == NULL) 117 T = T->Right; 118 else if(T->Right = NULL) 119 T = T->Left; 120 free(TempCell); 121 } 122 return T; // Do not forget this line!! 123 } 124 125 ElementType Retrieve(Position P) 126 { 127 return P->Element; 128 }

測試文件

 1 #include "tree.h"
 2 #include <stdio.h>
 3 
 4 int main()
 5 {
 6     SearchTree T;
 7     Position P;
 8     int i = 0, j = 0;
 9 
10     T = MakeEmpty(NULL);
11     for( i = 0; i < 50; i++, j = ( j + 7 ) % 50 )
12         T = Insert( j, T );
13     for( i = 0; i < 50; i++ )
14         if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )
15             printf( "Error at %d\n", i );
16 
17     for( i = 0; i < 50; i += 2 )
18         T = Delete( i, T );
19 
20     for( i = 1; i < 50; i += 2 )
21         if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )
22             printf( "Error at %d\n", i );
23     for( i = 0; i < 50; i += 2 )
24         if( ( P = Find( i, T ) ) != NULL )
25             printf( "Error at %d\n", i );
26 
27     printf( "Min is %d, Max is %d\n", Retrieve( FindMin2( T ) ),
28                Retrieve( FindMax2( T ) ) );
29 
30     return 0;
31 }

[數據結構與算法] : 二叉查找樹