首页 > 代码库 > 二叉搜索树的实现
二叉搜索树的实现
实现:
1 #ifndef BINARY_SEARCH_TREE_H 2 #define BINARY_SEARCH_TREE_H 3 4 #include "dsexceptions.h" 5 #include <iostream> // For NULL 6 using namespace std; 7 8 // BinarySearchTree class 9 // 10 // CONSTRUCTION: with ITEM_NOT_FOUND object used to signal failed finds 11 // 12 // ******************PUBLIC OPERATIONS********************* 13 // void insert( x ) --> Insert x 14 // void remove( x ) --> Remove x 15 // bool contains( x ) --> Return true if x is present 16 // Comparable findMin( ) --> Return smallest item 17 // Comparable findMax( ) --> Return largest item 18 // boolean isEmpty( ) --> Return true if empty; else false 19 // void makeEmpty( ) --> Remove all items 20 // void printTree( ) --> Print tree in sorted order 21 // ******************ERRORS******************************** 22 // Throws UnderflowException as warranted 23 24 template <typename Comparable> 25 class BinarySearchTree 26 { 27 public: 28 BinarySearchTree( ) :root( NULL ) 29 { 30 } 31 32 BinarySearchTree( const BinarySearchTree & rhs ) : root( NULL ) 33 { 34 *this = rhs; 35 } 36 37 /** 38 * Destructor for the tree 39 */ 40 ~BinarySearchTree( ) 41 { 42 makeEmpty( ); 43 } 44 45 /** 46 * Find the smallest item in the tree. 47 * Throw UnderflowException if empty. 48 */ 49 const Comparable & findMin( ) const 50 { 51 if( isEmpty( ) ) 52 throw UnderflowException( ); 53 return findMin( root )->element; 54 } 55 56 /** 57 * Find the largest item in the tree. 58 * Throw UnderflowException if empty. 59 */ 60 const Comparable & findMax( ) const 61 { 62 if( isEmpty( ) ) 63 throw UnderflowException( ); 64 return findMax( root )->element; 65 } 66 67 /** 68 * Returns true if x is found in the tree. 69 */ 70 bool contains( const Comparable & x ) const 71 { 72 return contains( x, root ); 73 } 74 75 /** 76 * Test if the tree is logically empty. 77 * Return true if empty, false otherwise. 78 */ 79 bool isEmpty( ) const 80 { 81 return root == NULL; 82 } 83 84 /** 85 * Print the tree contents in sorted order. 86 */ 87 void printTree( ostream & out = cout ) const 88 { 89 if( isEmpty( ) ) 90 out << "Empty tree" << endl; 91 else 92 printTree( root, out ); 93 } 94 95 /** 96 * Make the tree logically empty. 97 */ 98 void makeEmpty( ) 99 {100 makeEmpty( root );101 }102 103 /**104 * Insert x into the tree; duplicates are ignored.105 */106 void insert( const Comparable & x )107 {108 insert( x, root );109 }110 111 /**112 * Remove x from the tree. Nothing is done if x is not found.113 */114 void remove( const Comparable & x )115 {116 remove( x, root );117 }118 119 /**120 * Deep copy.121 */122 const BinarySearchTree & operator=( const BinarySearchTree & rhs )123 {124 if( this != &rhs )125 {126 makeEmpty( );127 root = clone( rhs.root );128 }129 return *this;130 }131 132 private:133 struct BinaryNode134 {135 Comparable element;136 BinaryNode *left;137 BinaryNode *right;138 139 BinaryNode( const Comparable & theElement, BinaryNode *lt, BinaryNode *rt )140 : element( theElement ), left( lt ), right( rt ) { }141 };142 143 BinaryNode *root;144 145 146 /**147 * Internal method to insert into a subtree.148 * x is the item to insert.149 * t is the node that roots the subtree.150 * Set the new root of the subtree.151 */152 void insert( const Comparable & x, BinaryNode * & t )153 {154 if( t == NULL )155 t = new BinaryNode( x, NULL, NULL );156 else if( x < t->element )157 insert( x, t->left );158 else if( t->element < x )159 insert( x, t->right );160 else161 ; // Duplicate; do nothing162 }163 164 /**165 * Internal method to remove from a subtree.166 * x is the item to remove.167 * t is the node that roots the subtree.168 * Set the new root of the subtree.169 */170 void remove( const Comparable & x, BinaryNode * & t )171 {172 if( t == NULL )173 return; // Item not found; do nothing174 if( x < t->element )175 remove( x, t->left );176 else if( t->element < x )177 remove( x, t->right );178 else if( t->left != NULL && t->right != NULL ) // Two children179 {180 t->element = findMin( t->right )->element;181 remove( t->element, t->right );182 }183 else184 {185 BinaryNode *oldNode = t;186 t = ( t->left != NULL ) ? t->left : t->right;187 delete oldNode;188 }189 }190 191 /**192 * Internal method to find the smallest item in a subtree t.193 * Return node containing the smallest item.194 */195 BinaryNode * findMin( BinaryNode *t ) const196 {197 if( t == NULL )198 return NULL;199 if( t->left == NULL )200 return t;201 return findMin( t->left );202 }203 204 /**205 * Internal method to find the largest item in a subtree t.206 * Return node containing the largest item.207 */208 BinaryNode * findMax( BinaryNode *t ) const209 {210 if( t != NULL )211 while( t->right != NULL )212 t = t->right;213 return t;214 }215 216 217 /**218 * Internal method to test if an item is in a subtree.219 * x is item to search for.220 * t is the node that roots the subtree.221 */222 bool contains( const Comparable & x, BinaryNode *t ) const223 {224 if( t == NULL )225 return false;226 else if( x < t->element )227 return contains( x, t->left );228 else if( t->element < x )229 return contains( x, t->right );230 else231 return true; // Match232 }233 /****** NONRECURSIVE VERSION*************************234 bool contains( const Comparable & x, BinaryNode *t ) const235 {236 while( t != NULL )237 if( x < t->element )238 t = t->left;239 else if( t->element < x )240 t = t->right;241 else242 return true; // Match243 244 return false; // No match245 }246 *****************************************************/247 248 /**249 * Internal method to make subtree empty.250 */251 void makeEmpty( BinaryNode * & t )252 {253 if( t != NULL )254 {255 makeEmpty( t->left );256 makeEmpty( t->right );257 delete t;258 }259 t = NULL;260 }261 262 /**263 * Internal method to print a subtree rooted at t in sorted order.264 */265 void printTree( BinaryNode *t, ostream & out ) const266 {267 if( t != NULL )268 {269 printTree( t->left, out );270 out << t->element << endl;271 printTree( t->right, out );272 }273 }274 275 /**276 * Internal method to clone subtree.277 */278 BinaryNode * clone( BinaryNode *t ) const279 {280 if( t == NULL )281 return NULL;282 else283 return new BinaryNode( t->element, clone( t->left ), clone( t->right ) );284 }285 };286 287 #endif
测试:
1 #include <iostream> 2 #include "BinarySearchTree.h" 3 using namespace std; 4 5 // Test program 6 int main( ) 7 { 8 BinarySearchTree<int> t; 9 int NUMS = 400000;10 const int GAP = 3711;11 int i;12 13 cout << "Checking... (no more output means success)" << endl;14 15 for( i = GAP; i != 0; i = ( i + GAP ) % NUMS )16 t.insert( i );17 18 for( i = 1; i < NUMS; i+= 2 )19 t.remove( i );20 21 if( NUMS < 40 )22 t.printTree( );23 if( t.findMin( ) != 2 || t.findMax( ) != NUMS - 2 )24 cout << "FindMin or FindMax error!" << endl;25 26 for( i = 2; i < NUMS; i+=2 )27 if( !t.contains( i ) )28 cout << "Find error1!" << endl;29 30 for( i = 1; i < NUMS; i+=2 )31 {32 if( t.contains( i ) )33 cout << "Find error2!" << endl;34 }35 36 BinarySearchTree<int> t2;37 t2 = t;38 39 for( i = 2; i < NUMS; i+=2 )40 if( !t2.contains( i ) )41 cout << "Find error1!" << endl;42 43 for( i = 1; i < NUMS; i+=2 )44 {45 if( t2.contains( i ) )46 cout << "Find error2!" << endl;47 }48 49 cout << "Finished testing" << endl;50 51 return 0;52 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。