Changeset 28e58fd for src/tests/avltree/avl3.c
- Timestamp:
- Aug 25, 2017, 10:38:34 AM (8 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:
- 800d275
- Parents:
- af08051 (diff), 3eab308c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/tests/avltree/avl3.c
raf08051 r28e58fd 1 1 #include "avl.h" 2 2 #include "avl-private.h" 3 4 // from stdlib 5 forall(otype T) 6 void swap(T *, T *); 3 #include <stdlib> 7 4 8 5 // swaps the data within two tree nodes 9 6 forall(otype K | Comparable(K), otype V) 10 7 void node_swap(tree(K, V) * t, tree(K, V) * t2){ 11 swap(&t->key, &t2->key);12 swap(&t->value, &t2->value);8 swap( t->key, t2->key); 9 swap( t->value, t2->value); 13 10 } 14 11 … … 16 13 forall(otype K | Comparable(K), otype V) 17 14 tree(K, V) * find_successor(tree(K, V) * t){ 18 19 20 21 22 23 24 25 26 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); 27 24 } 28 25 … … 30 27 forall(otype K | Comparable(K), otype V) 31 28 void deleteSingleNode(tree(K, V) * t) { 32 33 34 deleteSingleNode(t);29 t->left = NULL; 30 t->right = NULL; 31 delete(t); 35 32 } 36 33 … … 38 35 forall(otype K | Comparable(K), otype V) 39 36 tree(K, V) * remove_node(tree(K, V) * t){ 40 41 42 43 44 45 46 47 48 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; 49 46 50 51 52 47 // relink tree 48 t->left = tmp->left; 49 t->right = tmp->right; 53 50 54 55 56 57 58 59 60 61 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; 62 59 63 64 65 60 // relink tree 61 t->left = tmp->left; 62 t->right = tmp->right; 66 63 67 68 69 70 71 72 73 74 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; 75 72 76 77 78 79 80 81 82 83 84 85 86 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 } 87 84 } 88 85 … … 90 87 forall(otype K | Comparable(K), otype V) 91 88 tree(K, V) * remove_helper(tree(K, V) * t, K key, int * worked){ 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 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; 109 106 } 110 107 111 108 forall(otype K | Comparable(K), otype V) 112 109 int remove(tree(K, V) ** t, K key){ 113 114 115 116 110 int worked = 0; 111 tree(K, V) * newTree = remove_helper(*t, key, &worked); 112 *t = newTree; 113 return worked; 117 114 } 115 116 // Local Variables: // 117 // tab-width: 4 // 118 // End: //
Note:
See TracChangeset
for help on using the changeset viewer.