Changeset cb811ac for src/tests/avltree
- Timestamp:
- Aug 23, 2017, 9:02:41 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 7ece922
- Parents:
- d3e4d6c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/tests/avltree/avl3.c
rd3e4d6c rcb811ac 3 3 #include <stdlib> 4 4 5 // from stdlib6 forall(otype T)7 void swap(T *, T *);8 9 5 // swaps the data within two tree nodes 10 6 forall(otype K | Comparable(K), otype V) 11 7 void node_swap(tree(K, V) * t, tree(K, V) * t2){ 12 swap(&t->key, &t2->key);13 swap(&t->value, &t2->value);8 swap( t->key, t2->key); 9 swap( t->value, t2->value); 14 10 } 15 11 … … 17 13 forall(otype K | Comparable(K), otype V) 18 14 tree(K, V) * find_successor(tree(K, V) * t){ 19 20 21 22 23 24 25 26 27 15 tree(K, V) * find_successor_helper(tree(K, V) * t){ 16 // go left as deep as possible, return the last node 17 if (empty(t->left)){ 18 return t; 19 } else { 20 return find_successor_helper(t->left); 21 } 22 } 23 return find_successor_helper(t->right); 28 24 } 29 25 … … 31 27 forall(otype K | Comparable(K), otype V) 32 28 void deleteSingleNode(tree(K, V) * t) { 33 34 35 29 t->left = NULL; 30 t->right = NULL; 31 delete(t); 36 32 } 37 33 … … 39 35 forall(otype K | Comparable(K), otype V) 40 36 tree(K, V) * remove_node(tree(K, V) * t){ 41 42 43 44 45 46 47 48 49 37 // is the node a leaf? 38 if (empty(t->left) && empty(t->right)){ 39 // yes, just delete this node 40 delete(t); 41 return NULL; 42 } else if (empty(t->left)){ 43 // if the left is empty, there is only one child -> move right up 44 node_swap(t, t->right); 45 tree(K, V) * tmp = t->right; 50 46 51 52 53 47 // relink tree 48 t->left = tmp->left; 49 t->right = tmp->right; 54 50 55 56 57 58 59 60 61 62 51 setParent(t->left, t); 52 setParent(t->right, t); 53 deleteSingleNode(tmp); 54 return t; 55 } else if (empty(t->right)){ 56 // if the right is empty, there is only one child -> move left up 57 node_swap(t, t->left); 58 tree(K, V) * tmp = t->left; 63 59 64 65 66 60 // relink tree 61 t->left = tmp->left; 62 t->right = tmp->right; 67 63 68 69 70 71 72 73 74 75 64 setParent(t->left, t); 65 setParent(t->right, t); 66 deleteSingleNode(tmp); 67 return t; 68 } else { 69 // swap with the successor 70 tree(K, V) * s = find_successor(t); 71 tree(K, V) * parent = s->parent; 76 72 77 78 79 80 81 82 83 84 85 86 87 73 if (parent->left == s){ 74 parent->left = s->right; 75 } else { 76 assert(parent->right == s); 77 parent->right = s->right; 78 } 79 setParent(s->right, parent); 80 node_swap(t, s); 81 deleteSingleNode(s); 82 return t; 83 } 88 84 } 89 85 … … 91 87 forall(otype K | Comparable(K), otype V) 92 88 tree(K, V) * remove_helper(tree(K, V) * t, K key, int * worked){ 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 89 if (empty(t)){ 90 // did not work because key was not found 91 // set the status variable and return 92 *worked = 1; 93 } else if (t->key == key) { 94 t = remove_node(t); 95 } else if (t->key < key){ 96 t->right = remove_helper(t->right, key, worked); 97 } else { 98 // t->key > key 99 t->left = remove_helper(t->left, key, worked); 100 } 101 // try to fix after deleting 102 if (! empty(t)) { 103 t = tryFix(t); 104 } 105 return t; 110 106 } 111 107 112 108 forall(otype K | Comparable(K), otype V) 113 109 int remove(tree(K, V) ** t, K key){ 114 115 116 117 110 int worked = 0; 111 tree(K, V) * newTree = remove_helper(*t, key, &worked); 112 *t = newTree; 113 return worked; 118 114 } 115 116 // Local Variables: // 117 // tab-width: 4 // 118 // End: //
Note: See TracChangeset
for help on using the changeset viewer.