二叉查找树相对于 2-3 树和 AVL树简单,其它我就不多说,直接上代码
c语言版:
1 #ifndef _BINARY_SEARCH_TREE_H_ 2 #define _BINARY_SEARCH_TREE_H_ 3 4 typedef int Type; 5 6 typedef struct BSTreeNode { 7 Type key; 8 struct BSTreeNode *left; 9 struct BSTreeNode *right; 10 struct BSTreeNode *parent; 11 } Node, *BSTree; 12 13 void preorder_bstree(BSTree tree); 14 15 void inorder_bstree(BSTree tree); 16 17 void postorder_bstree(BSTree tree); 18 19 Node* bstree_search(BSTree x, Type key); 20 21 Node* iterative_bstree_search(BSTree x, Type key); 22 23 Node* bstree_minimun(BSTree tree); 24 25 Node* bstree_maximum(BSTree tree); 26 27 Node* bstree_successor(Node *x); 28 29 Node* bstree_predecessor(Node *x); 30 31 Node* insert_bstree(BSTree tree, Type key); 32 33 Node* delete_bstree(BSTree tree, Type key); 34 35 void destroy_bstree(BSTree tree); 36 37 void print_bstree(BSTree tree, Type key, int direction); 38 39 #endif
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "bstree.h" 4 5 void preorder_bstree(BSTree tree) 6 { 7 while(tree != NULL) 8 { 9 printf("%d ", tree->key); 10 preorder_bstree(tree->left); 11 preorder_bstree(tree->right); 12 } 13 } 14 15 void inorder_bstree(BSTree tree) 16 { 17 while(tree != NULL) 18 { 19 inorder_bstree(tree->left); 20 printf("%d ", tree->key); 21 inorder_bstree(tree->right); 22 } 23 } 24 25 void postorder_bstree(BSTree tree) 26 { 27 while(tree != NULL) 28 { 29 postorder_bstree(tree->left); 30 postorder_bstree(tree->right); 31 printf("%d ", tree->key); 32 } 33 } 34 35 Node* bstree_search(BSTree x, Type key) 36 { 37 if(x == NULL || x->key == key) 38 return x; 39 if(key < x->key) 40 return bstree_search(x->left, key); 41 else 42 return bstree_search(x->right, key); 43 } 44 45 Node* iterative_bstree_search(BSTree x, Type key) 46 { 47 while((x != NULL) || (x->key != key)) 48 { 49 if(x->key > key) 50 x = x->left; 51 else 52 x = x->right; 53 } 54 55 return x; 56 } 57 58 Node* bstree_maximum(BSTree tree) 59 { 60 if(tree == NULL) 61 return NULL; 62 while(tree->right != NULL) 63 tree = tree->right; 64 return tree; 65 } 66 67 Node* bstree_minimun(BSTree tree) 68 { 69 if(tree == NULL) 70 return NULL; 71 while(tree->left != NULL) 72 tree = tree->left; 73 return tree; 74 } 75 76 Node* bstree_successor(Node* x) 77 { 78 if(x->left != NULL) 79 return bstree_maximum(x->left); 80 Node* y = x->parent; 81 while((y != NULL) && (x == y->left)) 82 { 83 x = y; 84 y = x->parent; 85 } 86 return y; 87 } 88 89 Node* bstree_predecessor(Node* x) 90 { 91 if(x->right != NULL) 92 return bstree_minimun(x->right); 93 Node* y = x->parent; 94 while((y != NULL) && (x == y->right)) 95 { 96 x = y; 97 y = y->parent; 98 } 99 return y; 100 } 101 102 Node* create_bstree_node(Type key, Node* parent, Node* left, Node* right) 103 { 104 Node* p; 105 if((p = (Node*)malloc(sizeof(Node))) == NULL) 106 return NULL; 107 p->key = key; 108 p->parent = parent; 109 p->left = left; 110 p->right = right; 111 return p; 112 } 113 114 Node* bstree_insert(BSTree tree, Node* z) 115 { 116 Node* y = NULL; 117 Node* x = tree; 118 119 while(x != NULL) 120 { 121 y = x; 122 if(x -> key < z->key) 123 x = x->right; 124 else 125 x = x->left; 126 } 127 128 z->parent = y; 129 if(y == NULL) 130 tree = z; 131 else if(z->key < y->key) 132 y->left = z; 133 else if(z->key > y->key) 134 y->right = z; 135 return tree; 136 } 137 138 Node* insert_bstree(BSTree tree, Type key) 139 { 140 Node *p; 141 if((p = create_bstree_node(key, NULL, NULL, NULL)) == NULL) 142 return NULL; 143 bstree_insert(tree, p); 144 } 145 146 Node* bstree_delete(BSTree tree, Node *z) 147 { 148 Node* x = NULL; 149 Node* y = NULL; 150 151 if((z->left == NULL) || (z->right == NULL)) 152 y = z; 153 else 154 y = bstree_successor(z); 155 156 if(y->left != NULL) 157 x = y->left; 158 else 159 x = y->right; 160 161 if(x != NULL) 162 x->parent = y->parent; 163 164 if(y->parent == NULL) 165 tree = x; 166 else if(y == y->parent->left) 167 y->parent->left = x; 168 else 169 y->parent->right = x; 170 171 if(y != z) 172 z->key = y->key; 173 174 if(y != NULL) 175 free(y); 176 177 return tree; 178 } 179 180 Node* delete_bstree(BSTree tree, Type key) 181 { 182 Node* z, *node; 183 if((z = bstree_search(tree, key)) != NULL) 184 tree = bstree_delete(tree, z); 185 return tree; 186 } 187 188 void destroy_bstree(BSTree tree) 189 { 190 if(tree == NULL) 191 return; 192 if(tree->left != NULL) 193 destroy_bstree(tree->left); 194 if(tree->right != NULL) 195 destroy_bstree(tree->right); 196 free(tree); 197 } 198 199 void print_bstree(BSTree tree, Type key, int direction) 200 { 201 if(tree != NULL) 202 { 203 if(direction==0) 204 printf("%2d is root\n", tree->key); 205 else 206 printf("%2d is %2d's %6s child\n", tree->key, key, direction==1?"right" : "left"); 207 208 print_bstree(tree->left, tree->key, -1); 209 print_bstree(tree->right,tree->key, 1); 210 } 211 }
1 #include <stdio.h> 2 #include "bstree.h" 3 4 static int arr[]= {1,5,4,3,2,6}; 5 #define TBL_SIZE(a) ( (sizeof(a)) / (sizeof(a[0])) ) 6 7 int main() 8 { 9 int i; 10 int ilen; 11 12 BSTree root = NULL; 13 printf("== add: "); 14 ilen = TBL_SIZE(arr); 15 for(i = 0; i < ilen; i++) 16 { 17 printf("%d ", arr[i]); 18 root = insert_bstree(root, arr[i]); 19 } 20 getchar(); 21 return 0; 22 }
但这里有个问题 , 你们看到可以给我解答一下,我也方便以后回头看一下
就是在window下的动态链接dll, 除了vc++ 的library 外,还有什么方式生成,就比如linux下可以直接生成.so文件
来直接动态链接,window下我发现是无能为里,只能用静态链接。
C++版:
1 #include <iostream> 2 #include <stack> 3 #include <cstdlib> 4 5 using namespace std; 6 7 template<class T> 8 class BinarySearchTreeNode 9 { 10 public : 11 T elem; 12 struct BinarySearchTreeNode<T> *parent; 13 struct BinarySearchTreeNode<T> *left; 14 struct BinarySearchTreeNode<T> *right; 15 }; 16 17 template <class T> 18 class BinarySearchTree 19 { 20 public: 21 BinarySearchTree(); 22 void tree_insert(const T& elem); 23 int tree_remove(const T& elem); 24 BinarySearchTreeNode<T>* tree_search(const T& elem) const; 25 T tree_minmum(BinarySearchTreeNode<T>* root) const; 26 T tree_maxmum(BinarySearchTreeNode<T>* root) const; 27 T tree_successor(const T& elem) const; 28 T tree_predecessor(const T& elem) const; 29 int empty() const; 30 void inorder_tree_walk() const; 31 BinarySearchTreeNode<T>* get_root() const 32 { 33 return root; 34 } 35 36 private: 37 BinarySearchTreeNode<T>* root; 38 }; 39 40 template <class T> 41 BinarySearchTree<T>::BinarySearchTree() 42 { 43 root = NULL; 44 } 45 46 template <class T> 47 void BinarySearchTree<T>::tree_insert(const T& elem) 48 { 49 if(!empty()) 50 { 51 BinarySearchTreeNode<T> *pnode = root; 52 BinarySearchTreeNode<T> *qnode = NULL; 53 BinarySearchTreeNode<T> *newnode = new BinarySearchTreeNode<T>; 54 newnode->elem = elem; 55 newnode->parent = NULL; 56 newnode->left = NULL; 57 newnode->right = NULL; 58 59 while(pnode) 60 { 61 qnode = pnode; 62 if(pnode->elem > elem) 63 pnode = pnode->left; 64 else 65 pnode = pnode->right; 66 } 67 68 if(qnode->elem > elem) 69 qnode->left = newnode; 70 else 71 qnode->right = newnode; 72 newnode->parent = qnode; 73 } 74 else 75 { 76 root = new BinarySearchTreeNode<T>; 77 root->elem = elem; 78 root->parent = NULL; 79 root->left = NULL; 80 root->right = NULL; 81 } 82 } 83 84 template<class T> 85 int BinarySearchTree<T>::tree_remove(const T& elem) 86 { 87 BinarySearchTreeNode<T> *pnode; 88 BinarySearchTreeNode<T> *parentnode, *snode; 89 pnode = tree_search(elem); 90 if(pnode != NULL) 91 { 92 parentnode = pnode->parent; 93 if(pnode->right == NULL || pnode->left == NULL) 94 { 95 if(pnode->right != NULL) 96 { 97 if(parentnode->left == pnode) 98 parentnode->left = pnode->right; 99 if(parentnode->right == pnode) 100 parentnode->right = pnode->right; 101 } 102 else if(pnode->left != NULL) 103 { 104 if(parentnode->left == pnode) 105 parentnode->left = pnode->right; 106 if(parentnode->right == pnode) 107 parentnode->right = pnode->right; 108 } 109 else { 110 if(parentnode->left == pnode) 111 parentnode->left = NULL; 112 if(parentnode->right == pnode) 113 parentnode->right = NULL; 114 } 115 delete pnode; 116 } 117 else 118 { 119 snode = tree_search(tree_successor(pnode->elem)); 120 cout<<snode->elem<<endl; 121 pnode->elem = snode->elem; 122 if(snode->parent->left == snode) 123 { 124 snode->parent->left = snode->right; 125 snode->right->parent = snode->parent->left; 126 } 127 if(snode->parent->right == snode) 128 { 129 snode->parent->right = snode->right; 130 snode->right->parent = snode->parent->right; 131 } 132 delete snode; 133 } 134 return 0; 135 } 136 return -1; 137 } 138 139 140 template<class T> 141 BinarySearchTreeNode<T>* BinarySearchTree<T>::tree_search(const T& elem) const 142 { 143 BinarySearchTreeNode<T> *pnode = root; 144 while(pnode) 145 { 146 if(pnode->elem == elem) 147 break; 148 else if(pnode->elem > elem) 149 pnode = pnode->left; 150 else 151 pnode = pnode->right; 152 } 153 154 return pnode; 155 } 156 157 template<class T> 158 T BinarySearchTree<T>::tree_minmum(BinarySearchTreeNode<T> *root) const 159 { 160 BinarySearchTreeNode<T> *pnode = root; 161 if(pnode->left) 162 while(pnode->left) 163 pnode = pnode->left; 164 return pnode->elem; 165 } 166 167 template<class T> 168 T BinarySearchTree<T>::tree_maxmum(BinarySearchTreeNode<T> *root) const 169 { 170 BinarySearchTreeNode<T> *pnode = root; 171 if(pnode->left) 172 while(pnode->right) 173 pnode = pnode->right; 174 return pnode->elem; 175 } 176 177 template<class T> 178 T BinarySearchTree<T>::tree_successor(const T& elem) const 179 { 180 BinarySearchTreeNode<T> *pnode = tree_search(elem); 181 BinarySearchTreeNode<T> *parentnode; 182 if(pnode != NULL) 183 { 184 if(pnode->right) 185 return tree_minmum(pnode->right); 186 parentnode = pnode->parent; 187 while(parentnode && pnode == parentnode->left) 188 { 189 pnode = parentnode; 190 parentnode = parentnode->parent; 191 } 192 193 if(parentnode) 194 return parentnode->elem; 195 else 196 return T(); 197 } 198 return T(); 199 } 200 201 template<class T> 202 T BinarySearchTree<T>::tree_predecessor(const T& elem) const 203 { 204 BinarySearchTreeNode<T>* pnode = tree_search(elem); 205 BinarySearchTreeNode<T>* parentnode; 206 if(pnode != NULL) 207 { 208 if(pnode->left) 209 return tree_maxmum(pnode->left); 210 parentnode = pnode->parent; 211 while(parentnode && pnode == parentnode -> right) 212 { 213 pnode = parentnode; 214 parentnode = pnode->parent; 215 } 216 if(parentnode) 217 return parentnode->elem; 218 else 219 return T(); 220 } 221 return T(); 222 } 223 224 template<class T> 225 int BinarySearchTree<T>::empty() const 226 { 227 return (NULL == root)?1:0; 228 } 229 230 template<class T> 231 void BinarySearchTree<T>::inorder_tree_walk() const 232 { 233 if(NULL != root) 234 { 235 stack<BinarySearchTreeNode<T>*> s; 236 BinarySearchTreeNode<T> *ptmpnode; 237 ptmpnode = root; 238 while(NULL != ptmpnode || !s.empty()) 239 { 240 if(NULL != ptmpnode) 241 { 242 s.push(ptmpnode); 243 ptmpnode = ptmpnode->left; 244 } 245 else 246 { 247 ptmpnode = s.top(); 248 s.pop(); 249 cout<<ptmpnode->elem<<" "; 250 ptmpnode = ptmpnode->right; 251 } 252 } 253 } 254 } 255 256 int main() 257 { 258 BinarySearchTree<int> bstree; 259 BinarySearchTreeNode<int>* ptnode, *proot; 260 bstree.tree_insert(32); 261 bstree.tree_insert(21); 262 bstree.tree_insert(46); 263 bstree.tree_insert(54); 264 bstree.tree_insert(16); 265 bstree.tree_insert(38); 266 bstree.tree_insert(70); 267 cout<<"inorder tree walk is: "; 268 bstree.inorder_tree_walk(); 269 proot = bstree.get_root(); 270 cout<<"\nmax value is: " << bstree.tree_maxmum(proot)<<endl; 271 cout<<"min value is: " << bstree.tree_minmum(proot)<<endl; 272 ptnode = bstree.tree_search(38); 273 if(ptnode) 274 cout<<"exist"<<endl; 275 else 276 cout<<"error"<<endl; 277 cout<<"the successor of 38 is: " << bstree.tree_successor(38)<<endl; 278 cout<<"the predecessor of 38 is: "<< bstree.tree_predecessor(46)<<endl; 279 if(bstree.tree_remove(46) == 0) 280 cout<<"success"<<endl; 281 else 282 cout<<"error"<<endl; 283 cout<<"inorder tree walk is: "; 284 bstree.inorder_tree_walk(); 285 system("pause"); 286 }
浙公网安备 33010602011771号