uopspop

BinarySearchingTree_ClassVersion

May 29th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5.  
  6. class binary_tree_node
  7. {
  8.     friend class BST;
  9.     public:
  10.         binary_tree_node(int data):left(NULL),right(NULL)
  11.         {
  12.             _data = data;
  13.         }
  14.         ~binary_tree_node(){
  15.         }
  16.         int _data;
  17.         binary_tree_node *left;
  18.         binary_tree_node *right;
  19.    
  20. };
  21. typedef class binary_tree_node node;
  22.  
  23.  
  24. class BST{
  25.     public:
  26.         void insert_node(int value){
  27.             insert_nodeHelper(value);
  28.         }
  29.         void print_InOrder(){
  30.             print_InOrderHelper(root);
  31.         }
  32.         void print_PreOrder(){
  33.             print_PreOrderHelper(root);
  34.         }
  35.         void print_PostOrder(){
  36.             print_PostOrderHelper(root);
  37.         }
  38.         void search_node(int value){
  39.             if (search_nodeHelper(value))
  40.                 cout << "found: " << value << endl;
  41.             else
  42.                 cout << "not found" << endl;               
  43.         }
  44.         void delete_node(int value){
  45.             if (delete_nodeHelper(value))
  46.                 cout << "delete ok" << endl;
  47.             else
  48.                 cout << "delete failed" << endl;
  49.         }
  50.    
  51.     private:
  52.         node* root;
  53.         void insert_nodeHelper(int value);     
  54.         void print_InOrderHelper(node* ptr);
  55.         void print_PreOrderHelper(node* ptr);
  56.         void print_PostOrderHelper(node* ptr);
  57.         node* search_nodeHelper(int value);
  58.         bool delete_nodeHelper(int value);
  59.        
  60. };
  61.  
  62.  
  63. int main(){
  64.    
  65.     BST myBST;
  66.     int value;
  67.     while(1){
  68.         cout << "i insert"
  69.              << "\nl list"
  70.              << "\nf find"
  71.              << "\nd delete"
  72.              << "\nq quit"<< endl;
  73.  
  74.         char sel;
  75.         cin >> sel;
  76.         switch(sel){
  77.             case 'i':
  78.                 cout << "please input the value for the new node: ";
  79.                 cin >> value;
  80.                 myBST.insert_node(value);
  81.                 break;
  82.  
  83.             case 'l':
  84.                 cout << "PreOrder Traversal: ";
  85.                 myBST.print_PreOrder();
  86.                 cout << "\nInOrder Traversal: ";
  87.                 myBST.print_InOrder();
  88.                 cout << "\nPostOrder Traversal: ";
  89.                 myBST.print_PostOrder();
  90.                 break; 
  91.  
  92.             case 'f':
  93.                 cout << "please input the value for the new node: ";
  94.                 cin >> value;
  95.                 myBST.search_node(value);
  96.                 break;
  97.            
  98.             case 'd':
  99.                 cout << "please input the value: ";
  100.                 int value;
  101.                 cin >> value;
  102.                 myBST.delete_node(value);
  103.                 break;     
  104.  
  105.             case 'q':
  106.                 exit(0);               
  107.         }    
  108.        
  109.         system("pause");
  110.         system("cls");
  111.     }
  112.        
  113.    
  114. //  delete root;       
  115. }
  116.  
  117.  
  118.  
  119. void BST::insert_nodeHelper(int value){
  120.     node *current;
  121.     node *parent;
  122.  
  123.     if (root != NULL){
  124.         current = root;
  125.         while (current != NULL){
  126.             parent = current;
  127.  
  128.             if (current->_data > value)
  129.                 current = current->left;
  130.             else if (current->_data < value)
  131.                 current = current->right;
  132.             else{
  133.                 cout << "duplucate value" << endl;
  134.                 return;            
  135.             }
  136.         }
  137.         // now, we've got the parent node from which
  138.           //  we are gonna insert our new node underneath
  139.          
  140.         if (parent->_data > value)
  141.             parent->left = new node(value);
  142.         else if (parent->_data < value)
  143.             parent->right = new node(value);           
  144.     }else{
  145.         root = new node(value);    
  146.     }          
  147. }
  148.  
  149. void BST::print_InOrderHelper(node* ptr){
  150.     if (ptr == NULL)
  151.         return;
  152.     print_InOrderHelper(ptr->left);
  153.     cout << ptr->_data << " "; // key command
  154.     print_InOrderHelper(ptr->right);
  155. }      
  156. void BST::print_PreOrderHelper(node* ptr){
  157.     if (ptr == NULL)
  158.         return;
  159.     cout << ptr->_data << " "; // key command
  160.     print_PreOrderHelper(ptr->left);
  161.     print_PreOrderHelper(ptr->right);
  162. }      
  163. void BST::print_PostOrderHelper(node* ptr){
  164.     if (ptr == NULL)
  165.         return;
  166.     print_PostOrderHelper(ptr->left);
  167.     print_PostOrderHelper(ptr->right);
  168.     cout << ptr->_data << " "; // key command
  169. }      
  170. node* BST::search_nodeHelper(int value){
  171.     node* ptr = root;
  172.    
  173.     while (ptr != NULL){
  174.         if (ptr->_data == value)// 若第一個就中,那要找的就是根節點
  175.             return ptr;
  176.  
  177.         ptr = (ptr->_data > value)? ptr->left : ptr->right;    
  178.     }// end while
  179.  
  180.     return NULL;
  181. }      
  182.  
  183. bool BST::delete_nodeHelper(int value){
  184.     node* itemDeleted;
  185.     node* parent = NULL;
  186.     node* ptr = root;
  187.  
  188.     while (ptr != NULL){
  189.         if (ptr->_data == value){ // 若第一個就中,那要刪的就是根節點
  190.             itemDeleted = ptr;
  191.             break;                                             
  192.         }
  193.         parent = ptr;
  194.         ptr = (ptr->_data > value)? ptr->left : ptr->right;    
  195.     }// end while
  196.    
  197.     if (ptr == NULL) {
  198.         cout << value << " doesn't exist. "<< endl;
  199.         return false;
  200.     };
  201.        
  202.     // 要刪的節點沒有左子樹
  203.     if (itemDeleted->left == NULL){
  204.         // 要刪的節點是根節點
  205.         if (itemDeleted == root){
  206.             root = root->right;
  207.         // 要刪的節點在其父節點左方
  208.         }else if (itemDeleted == parent->left){
  209.             parent->left = itemDeleted->right;
  210.         // 要刪的節點在其父節點右方
  211.         }else if (itemDeleted == parent->right){
  212.             parent->right = itemDeleted->right;
  213.         }
  214.         delete itemDeleted;
  215.     // 要刪的節點沒有右子樹      
  216.     }else if(itemDeleted->right == NULL){
  217.         // 要刪的節點是根節點
  218.         if (itemDeleted == root){
  219.             root = root->left;
  220.         // 要刪的節點在其父節點左方
  221.         }else if (itemDeleted == parent->left){
  222.             parent->left = itemDeleted->left;
  223.         // 要刪的節點在其父節點右方
  224.         }else if (itemDeleted == parent->right){
  225.             parent->right = itemDeleted->left;
  226.         }
  227.         delete itemDeleted;        
  228.     // 要刪的節點有左右子樹      
  229.     }else{
  230.         // 從左子樹中找出最大的節點(小於且最接近要被刪除的節點值)
  231.         node* subparent = itemDeleted;
  232.         node* closestNo = itemDeleted->left;
  233.  
  234.         if (closestNo->right != NULL){
  235.             while(closestNo->right != NULL){
  236.                 subparent = closestNo;
  237.                 closestNo = closestNo->right;
  238.             }
  239.             subparent->right = closestNo->left;                            
  240.             itemDeleted->_data = closestNo->_data;
  241.         // 特殊狀況:本要來刪的節點左子節點值就是最大的數了
  242.         }else{
  243.             subparent->left = closestNo->left;     
  244.             itemDeleted->_data = closestNo->_data;         
  245.         }
  246.         // 注意:這裡要刪的,是跟原本要刪的節點對掉的那個節點
  247.         delete closestNo;          
  248.     }
  249.     return true;
  250. }
Add Comment
Please, Sign In to add comment