Advertisement
Kaidul

12347

Apr 9th, 2013
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <fstream>
  4. using namespace std;
  5.  
  6. struct treeNode {
  7.     treeNode* left;
  8.     treeNode* right;
  9.     int key;
  10. }*root;
  11.  
  12. template <class T> class BinarySearchTree {
  13. public:
  14.     BinarySearchTree() {
  15.         root = NULL;
  16.     }
  17.  
  18.     bool isEmpty() const {
  19.         return root == NULL;
  20.     }
  21.     void inorder(treeNode*);
  22.     void traverseInorder();
  23.  
  24.     void preorder(treeNode*);
  25.     void traversePreorder();
  26.  
  27.     void postorder(treeNode*);
  28.     void traversePostorder();
  29.  
  30.     void insert(T);
  31.  
  32.     void remove(T);
  33.  
  34.     treeNode* search(const T &);
  35.  
  36.     treeNode* findHelper(const T &, treeNode* &);
  37.     treeNode* find(const T &);
  38.  
  39.     treeNode* minHelper(treeNode* &);
  40.     treeNode* min();
  41.  
  42.     treeNode* maxHelper(treeNode* &);
  43.     treeNode* max();
  44.  
  45.     int sizeHelper(treeNode*);
  46.     int size();
  47. };
  48.  
  49. // Smaller elements go left
  50. // larger elements go right
  51. template <class T> void BinarySearchTree<T>::insert(T d) {
  52.     treeNode* t = new treeNode;
  53.     treeNode* parent;
  54.     t->key = d;
  55.     t->left = NULL;
  56.     t->right = NULL;
  57.     parent = NULL;
  58.  
  59.     // is this a new tree?
  60.     if(isEmpty()) root = t;
  61.     else {
  62.         //Note: ALL insertions are as leaf nodes
  63.         treeNode* curr;
  64.         curr = root;
  65.         // Find the Node's parent
  66.         while(curr) {
  67.             parent = curr;
  68.             if(t->key > curr->key) curr = curr->right;
  69.             else curr = curr->left;
  70.         }
  71.  
  72.         if(t->key < parent->key)
  73.             parent->left = t;
  74.         else
  75.             parent->right = t;
  76.     }
  77. }
  78.  
  79. template <class T>void BinarySearchTree<T>::remove(T d) {
  80.     //Locate the element
  81.     bool found = false;
  82.     if(isEmpty()) {
  83.         cout<<" This Tree is empty! "<<endl;
  84.         return;
  85.     }
  86.  
  87.     treeNode* curr;
  88.     treeNode* parent;
  89.     curr = root;
  90.  
  91.     // root to leaf search (top-down)
  92.     while(curr) {
  93.         if(curr->key == d) {
  94.             found = true;
  95.             break;
  96.         } else {
  97.             parent = curr;
  98.             if(d > curr->key) curr = curr->right;
  99.             else curr = curr->left;
  100.         }
  101.     }
  102.  
  103.     if(!found) {
  104.         cout<<" key not found! "<<endl;
  105.         return;
  106.     }
  107.  
  108.  
  109.     // 3 cases :
  110.     // 1. We're removing a leaf node
  111.     // 2. We're removing a node with a single child
  112.     // 3. we're removing a node with 2 children
  113.  
  114.  
  115.     //We're looking at a leaf node
  116.     if( curr->left == NULL && curr->right == NULL) {
  117.         if(parent->left == curr) parent->left = NULL;
  118.         else parent->right = NULL;
  119.         delete curr;
  120.         return;
  121.     }
  122.  
  123.     // Node with single child
  124.     if((curr->left == NULL && curr->right != NULL)|| (curr->left != NULL
  125.             && curr->right == NULL)) {
  126.         if(curr->left == NULL && curr->right != NULL) {
  127.             if(parent->left == curr) {
  128.                 parent->left = curr->right;
  129.                 delete curr;
  130.             } else {
  131.                 parent->right = curr->right;
  132.                 delete curr;
  133.             }
  134.         } else { // left child present, no right child
  135.             if(parent->left == curr) {
  136.                 parent->left = curr->left;
  137.                 delete curr;
  138.             } else {
  139.                 parent->right = curr->left;
  140.                 delete curr;
  141.             }
  142.         }
  143.         return;
  144.     }
  145.  
  146.     //Node with 2 children
  147.     // replace node with smallest value in right subtree
  148.     if (curr->left != NULL && curr->right != NULL) {
  149.         treeNode* chkr;
  150.         chkr = curr->right;
  151.         if((chkr->left == NULL) && (chkr->right == NULL)) {
  152.             curr = chkr;
  153.             delete chkr;
  154.             curr->right = NULL;
  155.         } else { // right child has children
  156.             //if the node's right child has a left child
  157.             // Move all the way down left to locate smallest element
  158.  
  159.             if((curr->right)->left != NULL) {
  160.                 treeNode* lcurr;
  161.                 treeNode* lcurrp;
  162.                 lcurrp = curr->right;
  163.                 lcurr = (curr->right)->left;
  164.                 while(lcurr->left != NULL) {
  165.                     lcurrp = lcurr;
  166.                     lcurr = lcurr->left;
  167.                 }
  168.                 curr->key = lcurr->key;
  169.                 delete lcurr;
  170.                 lcurrp->left = NULL;
  171.             } else {
  172.                 treeNode* tmp;
  173.                 tmp = curr->right;
  174.                 curr->key = tmp->key;
  175.                 curr->right = tmp->right;
  176.                 delete tmp;
  177.             }
  178.  
  179.         }
  180.         return;
  181.     }
  182.  
  183. }
  184.  
  185. template <class T>treeNode* BinarySearchTree<T>::search(const T &d) {
  186.     treeNode* current = root;
  187.     while (current) {
  188.         if(current -> key == d) {
  189.             return current;
  190.         } else if(d < current -> key) {
  191.             current = current -> left;
  192.         } else current = current -> right;
  193.     }
  194.     return NULL;
  195. }
  196.  
  197. template <class T> treeNode* BinarySearchTree <T> :: findHelper(const T &d, treeNode* &node) {
  198.     if (!node || node -> key == d) return node;
  199.     else if(d < node -> key) findHelper(d, node -> left);
  200.     else findHelper(d, node -> right);
  201. }
  202.  
  203. template <class T> treeNode* BinarySearchTree <T> :: find(const T &d) {
  204.     return findHelper(d, root);
  205. }
  206.  
  207. template <class T> treeNode* BinarySearchTree <T> :: minHelper(treeNode* &node) {
  208.     if(node -> left == NULL) return node;
  209.     else minHelper(node -> left);
  210. }
  211.  
  212. template <class T> treeNode* BinarySearchTree <T> :: min() {
  213.     return minHelper(root);
  214. }
  215.  
  216. template <class T> treeNode* BinarySearchTree <T> :: maxHelper(treeNode* &node) {
  217.     if(node -> right == NULL) return node;
  218.     else maxHelper(node -> right);
  219. }
  220.  
  221. template <class T> treeNode* BinarySearchTree <T> :: max() {
  222.     return maxHelper(root);
  223. }
  224.  
  225. int count;
  226. template<class T>int BinarySearchTree<T>::sizeHelper(treeNode* p) {
  227.     if(p != NULL) {
  228.         if(p->left) sizeHelper(p->left);
  229.         if(p->right) sizeHelper(p->right);
  230.         count++;
  231.     } else return count;
  232. }
  233.  
  234. template<class T>int BinarySearchTree<T>::size() {
  235.     count = 0;
  236.     return sizeHelper(root);
  237. }
  238.  
  239.  
  240. /**
  241.   in-order - leftChild, root, rightChild
  242.   pre-order - root, leftChild, rightChild
  243.   post-order - leftChild, rightChild, root
  244. **/
  245. template<class T>void BinarySearchTree<T>::inorder(treeNode* p) {
  246.     if(p != NULL) {
  247.         if(p->left) inorder(p->left);
  248.         cout<<" "<<p->key<<" ";
  249.         if(p->right) inorder(p->right);
  250.     } else return;
  251. }
  252.  
  253. template<class T>void BinarySearchTree<T>::traverseInorder() {
  254.     inorder(root);
  255. }
  256.  
  257. template<class T>void BinarySearchTree<T>::preorder(treeNode* p) {
  258.     if(p != NULL) {
  259.         cout<<" "<<p->key<<" ";
  260.         if(p->left) preorder(p->left);
  261.         if(p->right) preorder(p->right);
  262.     } else return;
  263. }
  264.  
  265. template<class T>void BinarySearchTree<T>::traversePreorder() {
  266.     preorder(root);
  267. }
  268.  
  269. template<class T>void BinarySearchTree<T>::postorder(treeNode* p) {
  270.     if(p != NULL) {
  271.         if(p->left) postorder(p->left);
  272.         if(p->right) postorder(p->right);
  273.         cout << p->key << "\n";
  274.     } else return;
  275. }
  276.  
  277. template<class T>void BinarySearchTree<T>::traversePostorder() {
  278.     postorder(root);
  279. }
  280.  
  281. int main() {
  282.     freopen("input.txt", "r", stdin);
  283.     BinarySearchTree <int> btree;
  284.     int value;
  285.     treeNode* node;
  286.     while(cin >> value) {
  287.         btree.insert(value);
  288.     }
  289.     btree.traversePostorder();
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement