二叉查找树
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 6 typedef int ElementType; 7 8 struct TreeNode; 9 typedef struct TreeNode *Position; 10 typedef struct TreeNode *SearchTree; 11 12 13 SearchTree MakeEmpty( SearchTree T ); 14 Position Find(ElementType X,SearchTree T); 15 Position FindMin(SearchTree T); 16 Position FindMax(SearchTree T); 17 SearchTree Insert(ElementType X, SearchTree T); 18 SearchTree Delete(ElementType X, SearchTree T); 19 ElementType RETRIVE( Position P); 20 21 void PrintElement (SearchTree T); 22 void PreOrder(SearchTree T); 23 void InOrder(SearchTree T); 24 void PostOrder(SearchTree t); 25 26 27 28 struct TreeNode 29 { 30 ElementType Element; 31 SearchTree Left; 32 SearchTree Right; 33 }; 34 35 36 SearchTree 37 MakeEmpty(SearchTree T) 38 { 39 if( T != NULL) 40 { 41 MakeEmpty(T->Left); 42 MakeEmpty(T->Right); 43 free(T); 44 } 45 return NULL; 46 } 47 48 49 50 Position Find(ElementType X, SearchTree T) 51 { 52 if( T == NULL) 53 return NULL; 54 if(X < T->Element) 55 return Find(X,T->Left); 56 else if( X > T->Element) 57 return Find(X, T->Right); 58 else 59 return T; 60 } 61 62 Position FindMin(SearchTree T) 63 { 64 if( T == NULL) 65 return NULL; 66 else if( T->Left == NULL) 67 return T; 68 else 69 return FindMin(T); 70 } 71 72 73 Position FindMax(SearchTree T) 74 { 75 if( T == NULL) 76 return NULL; 77 else if( T->Right == NULL) 78 return T; 79 else return FindMax(T->Right); 80 } 81 82 83 84 SearchTree Insert(ElementType X, SearchTree T) 85 { 86 if(T == NULL) 87 { 88 T = malloc(sizeof(struct TreeNode)); 89 if( T == NULL) 90 printf("内存分配失败"); 91 else 92 { 93 T->Element = X; 94 T->Left = T->Right = NULL; 95 } 96 97 } 98 else if( X < T->Element) 99 T->Left = Insert(X,T->Left); 100 else if( X > T->Element) 101 T->Right = Insert(X,T->Right); 102 103 return T; 104 } 105 106 107 108 109 110 SearchTree Delete(ElementType X, SearchTree T) 111 { 112 Position Tmpcell; 113 if( T == NULL) 114 printf("ERROR "); 115 else if( X < T->Element) 116 T->Left = Delete(X,T->Left); 117 else if( X > T->Element) 118 T->Right = Delete(X,T->Right); 119 else if(T->Left && T->Right) 120 { 121 Tmpcell = FindMin( T->Right); 122 T->Element = Tmpcell->Element; 123 T->Right = Delete(T->Element,T->Right); 124 } 125 else 126 { 127 Tmpcell = T;; 128 if( T->Left == NULL) 129 T =T->Right; 130 else if(T->Right == NULL) 131 T =T->Left; 132 free(Tmpcell); 133 } 134 return T; 135 } 136 137 138 139 ElementType RETRIVE(Position P) 140 { 141 return P->Element; 142 } 143 144 oid PrintElement (SearchTree T) 145 { 146 printf("%3d ",RETRIVE(T)); 147 } 148 149 void PreOrder(SearchTree T) 150 { 151 if( T != NULL) 152 { 153 PrintElement(T); 154 PreOrder(T->Left); 155 PreOrder(T->Right); 156 } 157 } 158 159 160 void InOrder(SearchTree T) 161 { 162 if( T != NULL) 163 { 164 InOrder( T->Left); 165 PrintElement(T); 166 InOrder(T->Right); 167 } 168 } 169 170 171 172 oid PostOrder(SearchTree T) 173 { 174 if(T != NULL) 175 { 176 PostOrder(T->Left); 177 PostOrder(T->Right); 178 PrintElement(T); 179 } 180 } 181 182 183 int main() 184 { 185 SearchTree T = NULL; 186 int i, j, m, n; 187 ElementType tmp; 188 printf( "Number of Elements:" ); 189 scanf( "%d", &n ); 190 for ( i = 0; i < n; i++) 191 { 192 scanf( "%d", &tmp ); 193 T = Insert( tmp, T ); 194 } 195 printf( "\nPreOrder :" ); 196 PreOrder( T ); 197 printf( "\nInOrder :" ); 198 InOrder( T ); 199 printf( "\nPostOrder:" ); 200 PostOrder( T ); 201 printf( "\n" ); 202 return 0; 203 } 204 205