42 #include "searchTree.h"
44 #define max(a,b) ((a>b)? a:b)
57 void TreeNodeDeleteSingleNode(
treeNode* node)
62 void TreeNodeDeleteWholeTree(
treeNode* node)
64 if(node == NULL)
return;
65 TreeNodeDeleteWholeTree(node->left);
66 TreeNodeDeleteWholeTree(node->right);
67 TreeNodeDeleteSingleNode(node);
71 void (*keyPrint) (
void*))
73 if(node ==NULL)
return;
74 TreeNodePrint(node->left, keyPrint);
76 TreeNodePrint(node->right, keyPrint);
81 if(root == NULL)
return 0;
83 int leftdepth = TreeNodeDepth(root->left);
84 int rightdepth = TreeNodeDepth(root->right);
85 return 1 + max(leftdepth, rightdepth);
93 int (*compkey) (
void*,
void*))
99 else if(compkey(key, tree->key) < 0)
100 return TreeNodeFind(tree->left, key, compkey);
102 return TreeNodeFind(tree->right, key, compkey);
107 int (*compkey) (
void *,
void *))
116 if(compkey(newnode->key,x->key) < 0)
130 else if( compkey(newnode->key, y->key) <0)
147 if(node==NULL)
return tree;
149 if(node->left == NULL || node->right == NULL) {
158 x->parent = y->parent;
160 if(y->parent == NULL)
164 if(y == y->parent->left)
167 y->parent->right = x;
173 y = TreeNodeSuccessor(node);
174 assert(y->left == NULL);
178 y->parent = node->parent;
179 y->left = node->left;
180 node->left->parent = y;
187 x->parent = y->parent;
189 assert(y->parent != NULL);
190 if(y == y->parent->left)
193 y->parent->right = x;
195 y->parent = node->parent;
196 y->left = node->left;
197 y->right = node->right;
198 node->left->parent = y;
199 node->right->parent = y;
201 if(node->parent != NULL) {
202 if(node->parent->left == node)
203 node->parent->left = y;
205 node->parent->right = y;
213 TreeNodeDeleteSingleNode(node);
223 if(temp == NULL)
return NULL;
224 while(temp->left != NULL) {
235 if(temp == NULL)
return NULL;
236 while(temp->right != NULL) {
246 if(node == NULL)
return NULL;
247 if(node->right != NULL)
248 return TreeNodeMinimum(node->right);
254 while(y != NULL && x == y->right)
268 if(node == NULL)
return NULL;
269 if(node->left != NULL)
270 return TreeNodeMaximum(node->left);
275 while(y != NULL && x == y->left)