Guest User

Untitled

a guest
Apr 17th, 2014
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cassert>
  4. #include <cstdlib>
  5. #include <ctime>
  6.  
  7. using namespace std;
  8.  
  9. struct BST_Node {
  10.     string key;
  11.     // we'll ignore "stuff"
  12.     string stuff;
  13.     BST_Node* left;
  14.     BST_Node* right;
  15. };
  16.  
  17. typedef BST_Node* BST;
  18.  
  19. void BST_init (BST& root) {
  20.     root = NULL;
  21. }
  22.  
  23. bool BST_isEmpty(BST root) {
  24.     return NULL == root;
  25. }
  26.  
  27. bool BST_has(string key, BST curNode) {
  28.     if (BST_isEmpty(curNode)) { // i.e., NULL == ROOT
  29.         return false;
  30.     } else if (key == curNode->key) {
  31.         return true;
  32.     } else if (key < curNode->key) {
  33.         return BST_has (key,curNode->left);
  34.     } else {
  35.         return BST_has (key,curNode->right);
  36.     }
  37. }
  38.  
  39. BST BST_insert (string key, BST &curNode) {
  40.     if (NULL == curNode) {
  41.         curNode = new BST_Node;
  42.         curNode->key = key;
  43.         curNode->left = NULL;
  44.         curNode->right = NULL;
  45.     } else if (key == curNode->key) {
  46.         cerr << "duplicate key: " << key << endl;
  47.         assert(false);
  48.     } else if (key < curNode->key) {
  49.         curNode->left = BST_insert (key,curNode->left);
  50.     } else {
  51.         curNode->right = BST_insert(key,curNode->right);
  52.     }
  53.     return curNode;
  54. }
  55.  
  56. void BST_print(BST curNode) {
  57.     if (curNode != NULL) {
  58.         BST_print (curNode->left);
  59.         cout << curNode->key << endl;
  60.         BST_print (curNode->right);
  61.     }
  62. }
  63.  
  64. string BST_lookup (const BST& root, string key) {
  65.     if (BST_isEmpty(root)) {
  66.         return ""; // or "ERROR", or ... umm ...
  67.     } else if (key == root->key) {
  68.         return root->stuff;
  69.     } else if (key < root->key) {
  70.         return BST_lookup (root->left, key);
  71.     } else {
  72.         return BST_lookup (root->right, key);
  73.     }
  74. }
  75.  
  76. void BST_delete(string key, BST& tree) {
  77.     assert (!BST_isEmpty(tree));
  78.     BST_Node *previousNode = tree;
  79.     BST_Node *deleteNode = tree;
  80.  
  81.     while(deleteNode != NULL && key != deleteNode->key){
  82.         if (key < deleteNode->key) {
  83.             previousNode = deleteNode;
  84.             deleteNode = deleteNode->left;
  85.         } else {
  86.             previousNode = deleteNode;
  87.             deleteNode = deleteNode->right;
  88.         }
  89.     }
  90.     if (NULL == deleteNode) {
  91.         return;
  92.     }
  93.     if(deleteNode->left == NULL && deleteNode->right == NULL){
  94.         //      cout << "Test: " << previousNode->left->key << deleteNode->key;
  95.         if(tree->key == deleteNode->key){
  96.             tree = NULL;
  97.         }else if(previousNode->left != NULL && previousNode->left->key == deleteNode->key){
  98.             previousNode->left=NULL;
  99.         }else{
  100.             previousNode->right=NULL;
  101.         }
  102.         delete deleteNode;
  103.     }else if(deleteNode->left == NULL && deleteNode->right != NULL){
  104.         if(tree->key == deleteNode->key){
  105.             tree = deleteNode->right;
  106.         }else if(previousNode->left != NULL && previousNode->left->key == deleteNode->key){
  107.             previousNode->left = deleteNode->right;
  108.         }else if(previousNode->right != NULL && previousNode->right->key == deleteNode->key){
  109.             previousNode->right = deleteNode->right;
  110.         }
  111.         delete deleteNode;
  112.     }else if(deleteNode->right == NULL && deleteNode->left != NULL){
  113.         if(tree->key == deleteNode->key){
  114.             tree = deleteNode->left;
  115.         }else if(previousNode->right != NULL && previousNode->right->key == deleteNode->key){
  116.             previousNode->right = deleteNode->left;
  117.         }else if(previousNode->left != NULL && previousNode->left->key == deleteNode->key){
  118.             previousNode->left = deleteNode->left;
  119.         }
  120.         delete deleteNode;
  121.     }else{
  122.         BST_Node *switchNode = deleteNode->left;
  123.         BST_Node *previousSwitchNode = deleteNode;
  124.         while(switchNode->right != NULL){
  125.             previousSwitchNode = switchNode;
  126.             switchNode = switchNode->right;
  127.         }
  128.  
  129.         if(deleteNode->key == previousSwitchNode->key){
  130.             //previousSwitchNode->left = switchNode->left;
  131.             switchNode->right = deleteNode->right;
  132.             if(tree->key == deleteNode->key){
  133.                 tree = switchNode;
  134.                 delete deleteNode;
  135.             }else{
  136.                 if(previousNode->left == NULL || previousNode->left->key == deleteNode->key){
  137.                     previousNode->left = switchNode;
  138.                 }else if(previousNode->right == NULL || previousNode->right->key == deleteNode->key){
  139.                     previousNode->right = switchNode;
  140.                 }
  141.                 delete deleteNode;
  142.             }
  143.         }else{
  144.             previousSwitchNode->right = switchNode->left;
  145.             switchNode->left = deleteNode->left;
  146.             switchNode->right = deleteNode->right;
  147.             if(tree->key == deleteNode->key){
  148.                 tree = switchNode;
  149.                 delete deleteNode;
  150.             }else{
  151.                 if(previousNode->left == NULL || previousNode->left->key == deleteNode->key){
  152.                     previousNode->left = switchNode;
  153.                 }else if(previousNode->right == NULL || previousNode->right->key == deleteNode->key){
  154.                     previousNode->right = switchNode;
  155.                 }
  156.                 delete deleteNode;
  157.             }
  158.         }
  159.     }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment