歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 【算法導論】二叉查找樹的操作C++實現

【算法導論】二叉查找樹的操作C++實現

日期:2017/3/1 10:08:34   编辑:Linux編程

本代碼為算法導論第12章中,偽代碼的C++實現:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. /*二叉查找樹結構*/
  5. typedef struct BSTree
  6. {
  7. int node_value;
  8. struct BSTree * left;
  9. struct BSTree * right;
  10. struct BSTree * parent;
  11. }Tree;
  12. Tree * root = NULL;
  13. /*****構造二叉查找樹**********************************************/
  14. void CreateBSTree(Tree * root,int node_value);
  15. Tree * CreateBSTree(int * array_list,int array_length);
  16. void Print(Tree* root);
  17. /***************************************************************/
  18. int Minimum(Tree * p);
  19. Tree * TreeMinimum(Tree * root);
  20. int Maximum(Tree * p);
  21. Tree * TreeMaximum(Tree * root);
  22. Tree * FindNode(Tree * root,int node_value);
  23. Tree * Successor(Tree * root);
  24. Tree * PredeSuccessor(Tree * p);
  25. bool DeleteTreeNode(Tree * root,int node_value);
  26. bool DeleteTreeNode(Tree * n);
  27. /***************************************************************/
  28. int main(int argc,char * argv[])
  29. {
  30. //int list[]={5,3,4,9,1,7,11};
  31. int list[]={15,5,16,3,12,20,10,13,18,23,6,7};
  32. root = CreateBSTree(list,12);
  33. std::cout<<"Cearte BSTree."<<std::endl;
  34. //Print(root);
  35. //std::cout<<Successor(FindNode(root,4))->node_value;
  36. //Print(root);
  37. //std::cout<<std::endl;
  38. //DeleteTreeNode(root,15);
  39. //Print(root);
  40. Tree * t = FindNode(root,18);
  41. std::cout<<PredeSuccessor(t)->node_value;
  42. getchar();
  43. return 0;
  44. }
  45. /*找出樹中的最小節點
  46. p數的根節點
  47. */
  48. int Minimum(Tree * p)
  49. {
  50. Tree * t = TreeMinimum(p);
  51. if(t != NULL)
  52. {
  53. return t->node_value ;
  54. }
  55. else
  56. {
  57. return -1;
  58. }
  59. }
  60. Tree * TreeMinimum(Tree * p)
  61. {
  62. if(p->left == NULL)
  63. {
  64. return p;
  65. }
  66. TreeMinimum(p->left);
  67. }
  68. /*找出樹中的最大節點*/
  69. int Maximum(Tree * p)
  70. {
  71. Tree * t = TreeMaximum(root);
  72. if(t != NULL)
  73. {
  74. return t->node_value ;
  75. }
  76. else
  77. {
  78. return -1;
  79. }
  80. }
  81. Tree * TreeMaximum(Tree * p)
  82. {
  83. if(p->right == NULL)
  84. {
  85. return p;
  86. }
  87. TreeMaximum(p->right);
  88. }
  89. /*假定所有的節點值都不相同,找到一個節點的指針
  90. p樹的根節點,
  91. node_value要查找的節點的值
  92. */
  93. Tree * FindNode(Tree * p,int node_value)
  94. {
  95. if(p == NULL)
  96. {
  97. return NULL;/*遞歸返回標志*/
  98. }
  99. if(p->node_value == node_value)
  100. {
  101. return p;
  102. }
  103. if(p->node_value < node_value)
  104. {
  105. FindNode(p->right, node_value);
  106. }
  107. else
  108. {
  109. FindNode(p->left, node_value);
  110. }
  111. }
  112. /*找出一個節點的後繼結點*/
  113. Tree * Successor(Tree * p)
  114. {
  115. if(p == NULL)
  116. {
  117. return NULL;
  118. }
  119. if(p->right != NULL)
  120. {
  121. return TreeMinimum(p->right);
  122. }
  123. Tree * t = p->parent ;
  124. while((t != NULL) && (p == t->right))
  125. {
  126. p = t;
  127. t = t->parent ;
  128. }
  129. return t;
  130. }
  131. /*找到一個節點的前驅節點
  132. p為節點的指針
  133. */
  134. Tree * PredeSuccessor(Tree * p)
  135. {
  136. if(p == NULL)
  137. {
  138. return NULL;
  139. }
  140. else if(p->left != NULL)
  141. {/*如果左子樹不為空,則前驅為其左子樹的最大值節點*/
  142. return TreeMaximum(p->left);
  143. }
  144. else
  145. {
  146. Tree * t = p->parent ;
  147. while((t != NULL) && (p == t->left))
  148. {/*注意節點t的方向,這個與尋找後繼節點相反*/
  149. p = t;
  150. t = t->parent;
  151. }
  152. return t;
  153. }
  154. }
  155. /*刪除一個節點
  156. p為樹根節點指針
  157. node_value要刪除的節點的值
  158. */
  159. bool DeleteTreeNode(Tree * p,int node_value)
  160. {
  161. Tree * t = FindNode(p,node_value);
  162. if(t == NULL)
  163. {
  164. return false;
  165. }
  166. if((t->left == NULL)&&(t->right == NULL))
  167. {/*沒有子節點*/
  168. Tree* tmp = t;
  169. if(tmp->parent->left == tmp)
  170. {
  171. tmp->parent->left = NULL;
  172. }
  173. else
  174. {
  175. tmp->parent->right = NULL;
  176. }
  177. delete tmp;
  178. tmp = NULL;
  179. }
  180. else if((t->left == NULL)||(t->right == NULL))
  181. {/*一個子節點*/
  182. Tree* tmp = t;
  183. if(tmp->parent->left == tmp)
  184. {
  185. tmp->parent->left = (tmp->left ==NULL)?tmp->right :tmp->left;
  186. }
  187. else
  188. {
  189. tmp->parent->right = (tmp->left ==NULL)?tmp->right :tmp->left;
  190. }
  191. delete tmp;
  192. tmp = NULL;
  193. }
  194. else
  195. {/*兩個子節點*/
  196. Tree* s = Successor(t);
  197. if(s == NULL)
  198. {
  199. return false;
  200. }
  201. t->node_value = s->node_value ;
  202. DeleteTreeNode(s);
  203. }
  204. }
  205. /*刪除一個節點
  206. p為樹根節點指針
  207. */
  208. bool DeleteTreeNode(Tree * n)
  209. {
  210. if(n == NULL)
  211. {
  212. return NULL;
  213. }
  214. else if((n->left == NULL)&&(n->right == NULL))
  215. {/*沒有子節點*/
  216. Tree* tmp = n;
  217. if(tmp->parent->left == tmp)
  218. {
  219. tmp->parent->left = NULL;
  220. }
  221. else
  222. {
  223. tmp->parent->right = NULL;
  224. }
  225. delete tmp;
  226. tmp = NULL;
  227. }
  228. else if((n->left == NULL)||(n->right == NULL))
  229. {/*一個子節點*/
  230. Tree* tmp = n;
  231. if(tmp->parent->left == tmp)
  232. {
  233. tmp->parent->left = (tmp->left ==NULL)?tmp->right :tmp->left;
  234. }
  235. else
  236. {
  237. tmp->parent->right = (tmp->left ==NULL)?tmp->right :tmp->left;
  238. }
  239. delete tmp;
  240. tmp = NULL;
  241. }
  242. else
  243. {/*兩個子節點*/
  244. Tree* s = Successor(n);
  245. if(s == NULL)
  246. {
  247. return false;
  248. }
  249. n->node_value = s->node_value ;
  250. DeleteTreeNode(s);
  251. }
  252. }
  253. /*生成二叉查找樹*/
  254. Tree * CreateBSTree(int * array_list,int array_length)
  255. {
  256. if(array_length <= 0)
  257. {
  258. return false;
  259. }
  260. Tree * root = NULL;
  261. root = new BSTree();
  262. root->left = NULL;
  263. root->right = NULL;
  264. root->parent = NULL;
  265. root->node_value = array_list[0];
  266. for(int i=1;i<array_length;i++)
  267. {
  268. CreateBSTree(root,array_list[i]);
  269. }
  270. return root;
  271. }
  272. void CreateBSTree(Tree * root,int node_value)
  273. {
  274. if(root == NULL)
  275. {
  276. return ;
  277. }
  278. if(root->node_value > node_value)
  279. {
  280. if(root->left == NULL)
  281. {
  282. Tree * node = new Tree();
  283. node->left = NULL;
  284. node->right = NULL;
  285. node->node_value = node_value;
  286. node->parent = root;
  287. root->left = node;
  288. }
  289. else
  290. {
  291. CreateBSTree(root->left,node_value);
  292. }
  293. }
  294. else
  295. {
  296. if(root->right == NULL)
  297. {
  298. Tree * node = new Tree();
  299. node->left = NULL;
  300. node->right = NULL;
  301. node->node_value = node_value;
  302. node->parent = root;
  303. root->right = node;
  304. }
  305. else
  306. {
  307. CreateBSTree(root->right,node_value);
  308. }
  309. }
  310. }
  311. /*中序排序輸出二叉查找樹*/
  312. void Print(Tree* root)
  313. {
  314. if(root == NULL)
  315. {
  316. return ;
  317. }
  318. Print(root->left);
  319. std::cout<<root->node_value<<"\t";
  320. Print(root->right);
  321. }
Copyright © Linux教程網 All Rights Reserved