KBinTree.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "KBinTree.h"
  2. KBinTree::KBinTree()
  3. {
  4. m_pTreeRoot = NULL;
  5. }
  6. //---------------------------------------------------------------------------
  7. // 函数: BTSearch
  8. // 功能:
  9. // 参数: TBinTreeNode * pParentTBinTreeNode
  10. // 参数: TBinTreeNode * pTBinTreeNode
  11. // 参数: DWORD nKey
  12. // 参数: BOOL * pResult
  13. // 返回: TBinTreeNode * 
  14. //---------------------------------------------------------------------------
  15. TBinTreeNode * KBinTree::Search(TBinTreeNode * pParentTBinTreeNode, TBinTreeNode * pTBinTreeNode, TBinTreeNode *pKeyNode, BOOL * pResult)
  16. {
  17. if (pTBinTreeNode == NULL || pParentTBinTreeNode == NULL)
  18. {
  19. *pResult = FALSE;
  20. return pParentTBinTreeNode;
  21. }
  22. if (*pKeyNode == *pTBinTreeNode)
  23. {
  24. *pResult = TRUE;
  25. return pTBinTreeNode;
  26. }
  27. else if (*pKeyNode > *pTBinTreeNode)
  28. return Search(pTBinTreeNode, pTBinTreeNode->pRightChild, pKeyNode, pResult);
  29. else
  30. return Search(pTBinTreeNode, pTBinTreeNode->pLeftChild, pKeyNode, pResult);
  31. }
  32. //---------------------------------------------------------------------------
  33. // 函数: BTInsert
  34. // 功能: 以pTScrpt为父,插入以szKey为关键点的结点
  35. // 参数: TBinTreeNode *pTBinTreeNode 
  36. // 参数: char * szKey
  37. // 返回: TBinTreeNode * 返回插入的结点
  38. //---------------------------------------------------------------------------
  39. TBinTreeNode * KBinTree::AddNode(TBinTreeNode *pNewTBinTreeNode, TBinTreeNode *pTBinTreeNode)
  40. {
  41. int nResult = 0;
  42. if (pNewTBinTreeNode == NULL)
  43. return NULL;
  44. pNewTBinTreeNode->pLeftChild = NULL;
  45. pNewTBinTreeNode->pParent = NULL;
  46. pNewTBinTreeNode->pRightChild = NULL;
  47. if (*pNewTBinTreeNode == *pTBinTreeNode)
  48. return NULL;
  49. //根据大小确定左子还是右子
  50. if (nResult = *pNewTBinTreeNode > *pTBinTreeNode)
  51. {
  52. pTBinTreeNode->pRightChild = pNewTBinTreeNode;
  53. pNewTBinTreeNode->pParent = pTBinTreeNode;
  54. }
  55. else 
  56. {
  57. pTBinTreeNode->pLeftChild = pNewTBinTreeNode;
  58. pNewTBinTreeNode->pParent = pTBinTreeNode;
  59. }
  60. return pNewTBinTreeNode;
  61. }
  62. //---------------------------------------------------------------------------
  63. // 函数:  BTDelete
  64. // 功能: 删除结点
  65. // 参数: TBinTreeNode * pTBinTreeNode
  66. // 参数: TBinTreeNode ** ppRootTBinTreeNode
  67. // 返回: TBinTreeNode * 
  68. //---------------------------------------------------------------------------
  69. TBinTreeNode *  KBinTree::RemoveNode(TBinTreeNode * pTBinTreeNode, TBinTreeNode ** ppRootTBinTreeNode)
  70. {
  71. TBinTreeNode * pFindTBinTreeNode;
  72. if (pTBinTreeNode == NULL)
  73. return NULL;
  74. if (pTBinTreeNode->pLeftChild == NULL && pTBinTreeNode->pRightChild == NULL)//该结点没有左右子
  75. {
  76. if (*ppRootTBinTreeNode == pTBinTreeNode)
  77. {
  78. *ppRootTBinTreeNode = NULL;
  79. }
  80. else
  81. {
  82. int nResult ;
  83. if (*pTBinTreeNode < *pTBinTreeNode->pParent)
  84. nResult = -1;
  85. else 
  86. nResult = 1;
  87. if (nResult < 0)//小于,处在父结点左方
  88. pTBinTreeNode->pParent->pLeftChild = NULL;
  89. else
  90. pTBinTreeNode->pParent->pRightChild = NULL;
  91. }
  92. // delete pTBinTreeNode;
  93. pTBinTreeNode = NULL;
  94. return NULL;
  95. }
  96. else if (!(pTBinTreeNode->pLeftChild && pTBinTreeNode->pRightChild))//只有单子时
  97. {
  98. if (pTBinTreeNode == *ppRootTBinTreeNode)
  99. {
  100. if (pTBinTreeNode->pLeftChild)
  101. {
  102. *ppRootTBinTreeNode = pTBinTreeNode->pLeftChild;
  103. pTBinTreeNode->pLeftChild->pParent = NULL;
  104. }
  105. else
  106. {
  107. *ppRootTBinTreeNode = pTBinTreeNode->pRightChild;
  108. pTBinTreeNode->pRightChild->pParent = NULL;
  109. }
  110. // delete pTBinTreeNode;
  111. pTBinTreeNode = NULL;
  112. return NULL;
  113. }
  114. int nResult ;
  115. if (*pTBinTreeNode < *pTBinTreeNode->pParent)
  116. nResult = -1;
  117. else 
  118. nResult = 1;
  119. if (nResult < 0)//在父的左边
  120. {
  121. if (pTBinTreeNode->pLeftChild)//只有左子
  122. {
  123. pTBinTreeNode->pParent->pLeftChild = pTBinTreeNode->pLeftChild;
  124. pTBinTreeNode->pLeftChild->pParent = pTBinTreeNode->pParent;
  125. }
  126. else
  127. {
  128. pTBinTreeNode->pParent->pLeftChild = pTBinTreeNode->pRightChild;
  129. pTBinTreeNode->pRightChild->pParent = pTBinTreeNode->pParent;
  130. }
  131. //delete pTBinTreeNode;
  132. pTBinTreeNode = NULL;
  133. }
  134. else 
  135. {
  136. if (pTBinTreeNode->pLeftChild)//只有左子
  137. {
  138. pTBinTreeNode->pParent->pRightChild = pTBinTreeNode->pLeftChild;
  139. pTBinTreeNode->pLeftChild->pParent = pTBinTreeNode->pParent;
  140. }
  141. else
  142. {
  143. pTBinTreeNode->pParent->pRightChild = pTBinTreeNode->pRightChild;
  144. pTBinTreeNode->pRightChild->pParent = pTBinTreeNode->pParent;
  145. }
  146. //delete pTBinTreeNode;
  147. pTBinTreeNode = NULL;
  148. return NULL;
  149. }  
  150. else//有全子 
  151. {
  152. {
  153. pFindTBinTreeNode = FindLess(pTBinTreeNode->pLeftChild);
  154. if (pFindTBinTreeNode)
  155. {
  156. //第一部分:处理该结点有左子时,对左子进行指向的改变
  157. //该结点仍有左子
  158. if (pFindTBinTreeNode->pLeftChild)
  159. {
  160. //当发现所将要替代的结点正是它的左子时,将原来的关系不将变化;否则按正常思路改变
  161. if (pFindTBinTreeNode != pTBinTreeNode->pLeftChild)
  162. {
  163. pFindTBinTreeNode->pParent->pRightChild = pFindTBinTreeNode->pLeftChild;
  164. pFindTBinTreeNode->pLeftChild->pParent = pFindTBinTreeNode->pParent;
  165. }
  166. }
  167. else
  168. {
  169. if (pFindTBinTreeNode != pTBinTreeNode->pLeftChild)
  170. {
  171. pFindTBinTreeNode->pParent->pRightChild = NULL;
  172. }
  173. }
  174. //第二部分:改变替换结点链结,实现与原结点相同。
  175. //处理当该替换的结点为删除结点的左子的特殊情况
  176. if (pFindTBinTreeNode == pTBinTreeNode->pLeftChild)
  177. {
  178. //其左子不用交代,保持原状
  179. pTBinTreeNode->pRightChild->pParent = pFindTBinTreeNode;
  180. //其左子不用交代,保持原状
  181. pFindTBinTreeNode->pRightChild = pTBinTreeNode->pRightChild;
  182. pFindTBinTreeNode->pParent = pTBinTreeNode->pParent;
  183. }
  184. else
  185. {
  186. pTBinTreeNode->pLeftChild->pParent = pFindTBinTreeNode;
  187. pTBinTreeNode->pRightChild->pParent = pFindTBinTreeNode;
  188. pFindTBinTreeNode->pLeftChild = pTBinTreeNode->pLeftChild ; 
  189. pFindTBinTreeNode->pRightChild = pTBinTreeNode->pRightChild;
  190. pFindTBinTreeNode->pParent = pTBinTreeNode->pParent;
  191. }
  192. //第三部分   删除结点之父结点链结
  193. if (*ppRootTBinTreeNode == pTBinTreeNode)
  194. {
  195. *ppRootTBinTreeNode = pFindTBinTreeNode;
  196. pFindTBinTreeNode->pParent = NULL;
  197. }
  198. else 
  199. {
  200. int nResult ;
  201. if (*pTBinTreeNode < *pTBinTreeNode->pParent)
  202. nResult = -1;
  203. else 
  204. nResult = 1;
  205. if (nResult < 0)//在父的左面
  206. {
  207. pTBinTreeNode->pParent->pLeftChild = pFindTBinTreeNode;
  208. }
  209. else
  210. {
  211. pTBinTreeNode->pParent->pRightChild = pFindTBinTreeNode;
  212. }
  213. }
  214. //delete pTBinTreeNode;
  215. pTBinTreeNode = NULL;
  216. return pFindTBinTreeNode;
  217. }
  218. else
  219. return NULL;
  220. }
  221. }
  222. }
  223. //---------------------------------------------------------------------------
  224. // 函数: BTFindLess
  225. // 功能:
  226. // 参数: TBinTreeNode * pTBinTreeNode
  227. // 返回: TBinTreeNode * 
  228. //---------------------------------------------------------------------------
  229. TBinTreeNode * KBinTree::FindLess(TBinTreeNode * pTBinTreeNode)
  230. {
  231. if (pTBinTreeNode == NULL)
  232. return NULL;
  233. if (pTBinTreeNode->pRightChild == NULL )
  234. return pTBinTreeNode;
  235. else
  236. return FindLess(pTBinTreeNode->pRightChild);
  237. }
  238. //---------------------------------------------------------------------------
  239. // 函数: BTPreorder
  240. // 功能:
  241. // 参数: TBinTreeNode * pTBinTreeNode
  242. // 返回: DWORD  
  243. //---------------------------------------------------------------------------
  244. DWORD  KBinTree::InOrder(TBinTreeNode * pTBinTreeNode)//中序遍历
  245. {
  246. static int Count = 0 ;
  247. if (pTBinTreeNode != NULL)
  248. {
  249. InOrder(pTBinTreeNode->pLeftChild);
  250. // printf("%dn", pTBinTreeNode->nKey);
  251. InOrder(pTBinTreeNode->pRightChild);
  252. Count ++;
  253. }
  254. m_TempCount = Count;
  255. return Count;
  256. }
  257. TBinTreeNode*  KBinTree::Insert(TBinTreeNode *pNewNode)
  258. {
  259. BOOL nResult = 0;
  260. TBinTreeNode * pNode = NULL;
  261. if (m_pTreeRoot == NULL) 
  262. {
  263. TBinTreeNode * pTBinTreeNode = pNewNode;
  264. m_pTreeRoot = pTBinTreeNode;
  265. pTBinTreeNode->pLeftChild = NULL;
  266. pTBinTreeNode->pRightChild = NULL;
  267. pTBinTreeNode->pParent = NULL;
  268. return pTBinTreeNode;
  269. }
  270. pNode = Search(m_pTreeRoot, m_pTreeRoot, pNewNode, &nResult);
  271. if (nResult == 1)
  272. {
  273. return NULL;
  274. }
  275. else if (nResult == 0)
  276. return AddNode(pNewNode, pNode);
  277. else return NULL;
  278. }
  279. BOOL   KBinTree::RemoveKeyNode(TBinTreeNode * pNode)
  280. {
  281. BOOL nResult = FALSE;//查找的结果
  282. TBinTreeNode * pTBinTreeNode = NULL;//查找返回的指针
  283. if (m_pTreeRoot == NULL)
  284. return FALSE;
  285. pTBinTreeNode = Search(m_pTreeRoot, m_pTreeRoot, pNode, &nResult);
  286. if (nResult && pTBinTreeNode) //在链表中找到了该关键字
  287. {
  288. return RemoveThisNode(pTBinTreeNode);
  289. }
  290. else
  291. return FALSE;
  292. return TRUE;
  293. }
  294. BOOL   KBinTree::RemoveThisNode(TBinTreeNode * pNode)
  295. {
  296. if (pNode == NULL)
  297. return FALSE;
  298. if (m_pTreeRoot == NULL)
  299. return FALSE;
  300. TBinTreeNode * pDelNode;
  301. //该结点并不属于表中的结点,则返回FALSE
  302. if (pNode->pLeftChild == NULL&&pNode->pRightChild == NULL && pNode->pParent == NULL && pNode != m_pTreeRoot)
  303. return FALSE;
  304. pDelNode = RemoveNode(pNode, &m_pTreeRoot);
  305. return TRUE;
  306. }
  307. TBinTreeNode * KBinTree::Search(TBinTreeNode * pKeyNode, BOOL * pResult)
  308. {
  309. TBinTreeNode * pNode;
  310. if (m_pTreeRoot == NULL)
  311. return NULL;
  312. pNode = Search(m_pTreeRoot, m_pTreeRoot, pKeyNode, pResult);
  313. return pNode;
  314. }