bstree.h
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:9k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /*
  2. Binary Search Tree
  3. Date:
  4. 2001/01/09
  5. Note: 
  6. 捞柳 沤祸 飘府
  7. Usage:
  8. 荤侩窍扁 傈 馆靛矫 SetCompareFunction甫 秦林绢具 茄促.
  9. 胶飘傅栏肺 虐 蔼阑 厚背且 版快 SetCompareStringFunction阑 龋免茄促.
  10. 促 静绊 抄 第俊 皋葛府甫 秦力窍扁 困秦辑 馆靛矫 ClearAll阑 龋免秦具 茄促. 
  11. */
  12. #ifndef __ORZ_DATASTRUCTURE_BINARY_SEARCH_TREE__
  13. #define __ORZ_DATASTRUCTURE_BINARY_SEARCH_TREE__
  14. /*
  15. Tree 畴靛 沥狼
  16. Note: class T狼 器牢磐甫 荤侩茄促.
  17. */
  18. template< class T >
  19. class CBsTreeNode
  20. {
  21. public:
  22. T *m_pData;
  23. CBsTreeNode< T > *m_pParent, *m_pLeft, *m_pRight;
  24. CBsTreeNode();
  25. virtual ~CBsTreeNode();
  26. void ClearAll( bool bDeleteData, bool bDeleteArray );
  27. CBsTreeNode< T > * GetMaxKeyNode();
  28. CBsTreeNode< T > * GetMinKeyNode();
  29. void Preorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg );
  30. void Inorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg );
  31. void Postorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg );
  32. };
  33. /*
  34. Tree 畴靛 备泅
  35. */
  36. template< class T >
  37. CBsTreeNode< T >::CBsTreeNode()
  38. : m_pData( NULL ), m_pParent( NULL ), m_pLeft( NULL ), m_pRight( NULL )
  39. {
  40. }
  41. template< class T >
  42. CBsTreeNode< T >::~CBsTreeNode()
  43. {
  44. }
  45. template< class T >
  46. void CBsTreeNode< T >::ClearAll( bool bDeleteData, bool bDeleteArray )
  47. {
  48. if ( m_pLeft )
  49. m_pLeft->ClearAll( bDeleteData, bDeleteArray );
  50. if ( m_pRight )
  51. m_pRight->ClearAll( bDeleteData, bDeleteArray );
  52. if ( bDeleteData )
  53. {
  54. if ( bDeleteArray )
  55. delete[] m_pData;
  56. else 
  57. delete m_pData;
  58. }
  59. delete this;
  60. }
  61. template< class T >
  62. CBsTreeNode< T > * CBsTreeNode< T >::GetMaxKeyNode()
  63. {
  64. CBsTreeNode< T > *pTemp = this;
  65. while ( pTemp->m_pRight )
  66. pTemp = pTemp->m_pRight;
  67. return pTemp;
  68. }
  69. template< class T >
  70. CBsTreeNode< T > * CBsTreeNode< T >::GetMinKeyNode()
  71. {
  72. CBsTreeNode< T > *pTemp = this;
  73. while ( pTemp->m_pLeft )
  74. pTemp = pTemp->m_pLeft;
  75. return pTemp;
  76. }
  77. template< class T >
  78. void CBsTreeNode< T >::Preorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg ) 
  79. {
  80. pfnCallback( pArg, m_pData );
  81. if ( m_pLeft )
  82. m_pLeft->Preorder( pfnCallback, pArg );
  83. if ( m_pRight )
  84. m_pRight->Preorder( pfnCallback, pArg );
  85. }
  86. template< class T >
  87. void CBsTreeNode< T >::Inorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg ) 
  88. {
  89. if ( m_pLeft )
  90. m_pLeft->Inorder( pfnCallback, pArg );
  91. pfnCallback( pArg, m_pData );
  92. if ( m_pRight )
  93. m_pRight->Inorder( pfnCallback, pArg );
  94. }
  95. template< class T >
  96. void CBsTreeNode< T >::Postorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg ) 
  97. {
  98. if ( m_pRight )
  99. m_pRight->Postorder( pfnCallback, pArg );
  100. if ( m_pLeft )
  101. m_pLeft->Postorder( pfnCallback, pArg );
  102. pfnCallback( pArg, m_pData );
  103. }
  104. /*
  105. Binary Search Tree 沥狼
  106. */
  107. template< class T >
  108. class CBsTree
  109. {
  110. protected:
  111. CBsTreeNode< T > *m_pRoot;
  112. // Key甫 厚背且 锭 龋免登绰 窃荐
  113. int  (*m_pfnCmp)( void *pArg, T *pFirst, T *pSecond );
  114. void *m_pArgCmpFunc;
  115. // String苞 Data甫 厚背且 锭 龋免登绰 窃荐
  116. int  (*m_pfnCmpStr)( void *pArg, T *pData, char *pString );
  117. void *m_pArgCmpStrFunc;
  118. int  m_nCount;
  119. public:
  120. CBsTree();
  121. virtual ~CBsTree();
  122. void ClearAll( bool bDeleteData = true, bool bDeleteArray = false );
  123. void SetCompareFunction( int (*pfnCmp)( void *pArg, T *pFirst, T *pSecond ), void *pArg );
  124. void SetCompareStringFunction( int (*pfnCmp)( void *pArg, T *pData, char *pString ), void *pArg );
  125. bool Insert( T *pData );
  126. T *  Remove( T *pKey );
  127. T *  Search( T *pKey );
  128. T *  SearchKeyString( char *pKey );
  129. CBsTreeNode< T > * SearchNode( T *pKey );
  130. void Preorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg );
  131. void Inorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg );
  132. void Postorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg );
  133. int  GetCount();
  134. bool IsEmpty();
  135. };
  136. /*
  137. Binary Search Tree 备泅
  138. */
  139. template< class T >
  140. CBsTree< T >::CBsTree()
  141. {
  142. m_pRoot = NULL;
  143. m_pfnCmp = NULL;
  144. m_pArgCmpFunc = NULL;
  145. m_pfnCmpStr = NULL;
  146. m_pArgCmpStrFunc = NULL;
  147. m_nCount = 0;
  148. }
  149. template< class T >
  150. CBsTree< T >::~CBsTree()
  151. {
  152. }
  153. template< class T >
  154. void CBsTree< T >::ClearAll( bool bDeleteData, bool bDeleteArray )
  155. {
  156. if ( m_pRoot )
  157. {
  158. m_pRoot->ClearAll( bDeleteData, bDeleteArray );
  159. m_pRoot = NULL;
  160. }
  161. }
  162. template< class T >
  163. void CBsTree< T >::SetCompareFunction( int (*pfnCmp)( void *pArg, T *pFirst, T *pSecond ), void *pArg )
  164. {
  165. m_pfnCmp = pfnCmp;
  166. m_pArgCmpFunc = pArg;
  167. }
  168. template< class T >
  169. void CBsTree< T >::SetCompareStringFunction( int (*pfnCmp)( void *pArg, T *pData, char *pString ), void *pArg )
  170. {
  171. m_pfnCmpStr = pfnCmp;
  172. m_pArgCmpStrFunc = pArg;
  173. }
  174. template< class T >
  175. bool CBsTree< T >::Insert( T *pData )
  176. {
  177. int nCmpResult;
  178. CBsTreeNode< T > *pTemp = m_pRoot, *pTempParent = NULL;
  179. while ( pTemp )
  180. {
  181. pTempParent = pTemp;
  182. nCmpResult = m_pfnCmp( m_pArgCmpFunc, pTemp->m_pData, pData );
  183. // 鞍篮 Key扼搁 
  184. if ( nCmpResult == 0 )
  185. return false;
  186. if ( nCmpResult > 0 )
  187. pTemp = pTemp->m_pLeft;
  188. else
  189. pTemp = pTemp->m_pRight;
  190. }
  191. pTemp = new CBsTreeNode< T >;
  192. if ( pTemp == NULL )
  193. return false;
  194. pTemp->m_pData = pData;
  195. pTemp->m_pParent = pTempParent;
  196. if ( m_pRoot == NULL )
  197. m_pRoot = pTemp;
  198. else if ( m_pfnCmp( m_pArgCmpFunc, pTemp->m_pData, pTempParent->m_pData ) < 0 )
  199. pTempParent->m_pLeft = pTemp;
  200. else
  201. pTempParent->m_pRight = pTemp;
  202. ++m_nCount;
  203. return true;
  204. }
  205. template< class T >
  206. T * CBsTree< T >::Remove( T *pKey )
  207. {
  208. if ( m_pRoot == NULL )
  209. return NULL;
  210. CBsTreeNode< T > *pTemp = SearchNode( pKey );
  211. if ( pTemp == NULL )
  212. return NULL;
  213. T *pData = pTemp->m_pData;
  214. // 磊侥捞 绝绰版快
  215. if ( pTemp->m_pLeft == NULL && pTemp->m_pRight == NULL )
  216. {
  217. if ( m_pRoot == pTemp )
  218. {
  219. m_pRoot = NULL;
  220. }
  221. else
  222. {
  223. if ( pTemp->m_pParent->m_pLeft == pTemp )
  224. pTemp->m_pParent->m_pLeft = NULL;
  225. else
  226. pTemp->m_pParent->m_pRight = NULL;
  227. }
  228. }
  229. // 磊侥捞 窍唱 乐绰 版快
  230. else if ( (pTemp->m_pLeft && pTemp->m_pRight == NULL) ||
  231.       (pTemp->m_pLeft == NULL && pTemp->m_pRight) )
  232. {
  233. CBsTreeNode< T > *pChild = pTemp->m_pLeft ? pTemp->m_pLeft : pTemp->m_pRight;
  234. if ( m_pRoot == pTemp )
  235. {
  236. m_pRoot = pChild;
  237. }
  238. else
  239. {
  240. pChild->m_pParent = pTemp->m_pParent;
  241. if ( pTemp->m_pParent->m_pLeft == pTemp )
  242. pTemp->m_pParent->m_pLeft = pChild;
  243. else
  244. pTemp->m_pParent->m_pRight = pChild;
  245. }
  246. }
  247. // 磊侥捞 笛牢 版快 哭率 辑宏 飘府俊辑 啊厘 奴 畴靛狼 蔼栏肺 摹券茄促.
  248. else
  249. {
  250. CBsTreeNode< T > *pMaxKeyNode = pTemp->m_pLeft->GetMaxKeyNode();
  251. pTemp->m_pData = pMaxKeyNode->m_pData;
  252. if ( pMaxKeyNode->m_pLeft )
  253. {
  254. pMaxKeyNode->m_pLeft->m_pParent = pMaxKeyNode->m_pParent;
  255. if ( pMaxKeyNode->m_pParent->m_pLeft == pMaxKeyNode )
  256. pMaxKeyNode->m_pParent->m_pLeft = pMaxKeyNode->m_pLeft;
  257. else
  258. pMaxKeyNode->m_pParent->m_pRight = pMaxKeyNode->m_pLeft;
  259. }
  260. else
  261. {
  262. if ( pMaxKeyNode->m_pParent->m_pLeft == pMaxKeyNode )
  263. pMaxKeyNode->m_pParent->m_pLeft = NULL;
  264. else
  265. pMaxKeyNode->m_pParent->m_pRight = NULL;
  266. }
  267. pTemp = pMaxKeyNode;
  268. }
  269. delete pTemp;
  270. --m_nCount;
  271. return pData;
  272. }
  273. template< class T >
  274. T * CBsTree< T >::Search( T *pKey )
  275. {
  276. int nCmpResult;
  277. CBsTreeNode< T > *pTemp = m_pRoot;
  278. while ( pTemp )
  279. {
  280. nCmpResult = m_pfnCmp( m_pArgCmpFunc, pTemp->m_pData, pKey );
  281. if ( nCmpResult == 0 )
  282. return pTemp->m_pData;
  283. if ( nCmpResult > 0 )
  284. pTemp = pTemp->m_pLeft;
  285. else
  286. pTemp = pTemp->m_pRight;
  287. }
  288. return NULL;
  289. }
  290. template< class T >
  291. T * CBsTree< T >::SearchKeyString( char *pKey )
  292. {
  293. int nCmpResult;
  294. CBsTreeNode< T > *pTemp = m_pRoot;
  295. while ( pTemp )
  296. {
  297. nCmpResult = m_pfnCmpStr( m_pArgCmpFunc, pTemp->m_pData, pKey );
  298. if ( nCmpResult == 0 )
  299. return pTemp->m_pData;
  300. if ( nCmpResult > 0 )
  301. pTemp = pTemp->m_pLeft;
  302. else
  303. pTemp = pTemp->m_pRight;
  304. }
  305. return NULL;
  306. }
  307. template< class T >
  308. CBsTreeNode< T > * CBsTree< T >::SearchNode( T *pKey )
  309. {
  310. int nCmpResult;
  311. CBsTreeNode< T > *pTemp = m_pRoot;
  312. while ( pTemp )
  313. {
  314. nCmpResult = m_pfnCmp( m_pArgCmpFunc, pTemp->m_pData, pKey );
  315. if ( nCmpResult == 0 )
  316. return pTemp;
  317. if ( nCmpResult > 0 )
  318. pTemp = pTemp->m_pLeft;
  319. else
  320. pTemp = pTemp->m_pRight;
  321. }
  322. return NULL;
  323. }
  324. template< class T >
  325. void CBsTree< T >::Preorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg )
  326. {
  327. if ( m_pRoot == NULL )
  328. return;
  329. m_pRoot->Preorder( pfnCallback, pArg );
  330. }
  331. template< class T >
  332. void CBsTree< T >::Inorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg )
  333. {
  334. if ( m_pRoot == NULL )
  335. return;
  336. m_pRoot->Inorder( pfnCallback, pArg );
  337. }
  338. template< class T >
  339. void CBsTree< T >::Postorder( void (*pfnCallback)( void *pArg, T *pData ), void *pArg )
  340. {
  341. if ( m_pRoot == NULL )
  342. return;
  343. m_pRoot->Postorder( pfnCallback, pArg );
  344. }
  345. template< class T >
  346. int CBsTree< T >::GetCount()
  347. {
  348. return m_nCount;
  349. }
  350. template< class T >
  351. bool CBsTree< T >::IsEmpty()
  352. {
  353. return m_nCount == 0;
  354. }
  355. #endif