数据结构 二叉排序树

举报
悦来客栈的老板 发表于 2020/12/28 23:47:32 2020/12/28
【摘要】 二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:    如果它的左子树不空,则左子树上所有结点的值均小于它的根结点的值    如果它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。   #include <stdio.h>#include...

二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:
   如果它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
   如果它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。

 


  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TRUE 1
  4. #define FALSE 0
  5. #define OVERFLOW -2
  6. typedef int TElemType;
  7. typedef struct BiTNode
  8. {
  9. TElemType data;
  10. struct BiTNode *lchild,*rchild;
  11. }BiTNode,*BiTree;
  12. /****************二叉排序树的查找*******************
  13. 参数说明:
  14. T 二叉排序树
  15. key 待查找的关键字
  16. f 指向T的双亲
  17. p 查找成功则指向该关键字的结点,返回TRUE,
  18. 失败则指向查找路径的最后一个结点,返回FALSE
  19. ****************************************************/
  20. int SearchBST(BiTree T, TElemType key, BiTree f, BiTree &p)
  21. {
  22. if (!T)
  23. {//查找失败
  24. p = f;
  25. return FALSE;
  26. }
  27. else if(key == T->data)
  28. {//查找成功
  29. p = T;
  30. return TRUE;
  31. }
  32. else if (key < T->data)
  33. {//关键字小于当前结点的值,则查找其左子树
  34. SearchBST(T->lchild,key, T, p);
  35. }
  36. else
  37. {//关键字大于当前结点的值,则查找其右子树
  38. SearchBST(T->rchild,key, T, p);
  39. }
  40. }
  41. /****************二叉排序树的插入*******************
  42. 二叉排序树的中序遍历是一个有序序列
  43. 参数说明:
  44. T 二叉排序树
  45. key 待插入的关键字
  46. 插入成功返回TRUE,失败返回FALSE
  47. ****************************************************/
  48. int InsertBST(BiTree &T, TElemType key)
  49. {
  50. BiTree p,s;
  51. if (!SearchBST(T,key,NULL,p))
  52. {//如果该二叉排序树没有该关键字则插入
  53. s = (BiTree)malloc(sizeof(BiTNode));
  54. if (!s)
  55. {
  56. exit(OVERFLOW);
  57. }
  58. s->data = key;
  59. s->lchild = NULL;
  60. s->rchild = NULL; //插入新的结点
  61. if (!p)
  62. {//如果当前是一棵空树
  63. T = s; //插入s为新的根结点
  64. }
  65. else if (key < p->data)
  66. {//关键字小则为其左子树
  67. p->lchild = s;
  68. }
  69. else
  70. {//关键字大则为其右子树
  71. p->rchild = s;
  72. }
  73. return TRUE;
  74. }
  75. else
  76. {//插入失败,即二叉树包含有该关键字的结点
  77. return FALSE;
  78. }
  79. }
  80. /****************二叉排序树的删除*******************
  81. 函数int Delete(BiTree &p);p是待删除的结点,并整理其左右子树
  82. 函数int DeleteBST(BiTree &T, int key)删除值为key的结点
  83. ****************************************************/
  84. /*
  85. int Delete(BiTree &p)
  86. {
  87. BiTree q,s;
  88. if (p->rchild == NULL)
  89. {//如果右子树为空,则直接拼接左子树
  90. q = p;
  91. p = p->lchild;
  92. free(q);
  93. }
  94. else if (p->lchild == NULL)
  95. {//如果左子树为空,则直接拼接右子树
  96. q = p;
  97. p = p->rchild;
  98. free(q);
  99. }
  100. else
  101. {//左右子树均不为空的情况,找到其中序序列的直接前驱
  102. q = p;
  103. s = p->lchild;
  104. while (s->rchild)
  105. {//转左,然后向右到尽头(找待删结点的前驱)
  106. q = s;
  107. s = s->rchild;
  108. }
  109. p->data = s->data ; //s指向被删结点的直接前驱
  110. if (q != p)
  111. {//重接q的右子树
  112. q->rchild = s->lchild ;
  113. }
  114. else
  115. {//重接q的左子树
  116. q->rchild = s->lchild ;
  117. }
  118. free(s);
  119. }
  120. return TRUE;
  121. }
  122. */
  123. int Delete(BiTree &p)
  124. {
  125. BiTree q,s;
  126. if (p->rchild == NULL)
  127. {//如果右子树为空,则直接拼接左子树
  128. q = p;
  129. p = p->lchild;
  130. free(q);
  131. }
  132. else if (p->lchild == NULL)
  133. {//如果左子树为空,则直接拼接右子树
  134. q = p;
  135. p = p->rchild;
  136. free(q);
  137. }
  138. else
  139. {//左右子树均不为空的情况,找到其中序序列的直接前驱
  140. q = p;
  141. s = p->rchild;
  142. while (s->lchild)
  143. {//转左,然后向右到尽头(找待删结点的前驱)
  144. q = s;
  145. s = s->lchild;
  146. }
  147. p->data = s->data ; //s指向被删结点的直接前驱
  148. if (q != p)
  149. {//重接q的左子树,不相等,则说明q->lchild = s;
  150. q->lchild = s->rchild ;
  151. }
  152. else
  153. {//重接q的右子树,相等,则说明s = q->rchild,即只有一个结点的时候;
  154. q->rchild = s->rchild ;
  155. }
  156. free(s);
  157. }
  158. return TRUE;
  159. }
  160. int DeleteBST(BiTree &T, int key)
  161. {
  162. if (!T)
  163. {
  164. return FALSE;
  165. }
  166. else
  167. {
  168. if (key == T->data)
  169. {
  170. return Delete(T);
  171. }
  172. else if (key < T->data)
  173. {
  174. return DeleteBST(T->lchild, key);
  175. }
  176. else
  177. {
  178. return DeleteBST(T->rchild, key);
  179. }
  180. }
  181. }
  182. void InOrderTraverse(BiTree T)
  183. {
  184. if (T == NULL)
  185. {
  186. return;
  187. }
  188. InOrderTraverse(T->lchild);//访问左子树
  189. printf("%d ",T->data);//访问根结点
  190. InOrderTraverse(T->rchild);//访问右子树
  191. }
  192. int main()
  193. {
  194. int i,n;
  195. int a[] = {62,88,58,47,35,73,51,99,37,93,29,37,36,49,56,48,50};
  196. BiTree T = NULL,p;
  197. for (i=0; i<sizeof(a) / sizeof(a[0]); i++)
  198. {
  199. InsertBST(T,a[i]);
  200. }
  201. printf("该二叉排序树的中序遍历:");
  202. InOrderTraverse(T);
  203. printf("\n");
  204. printf("请输入您要查找的关键字:");
  205. scanf("%d",&n);
  206. if (SearchBST(T,n,NULL,p))
  207. {
  208. printf("查找成功!\n");
  209. }
  210. else
  211. {
  212. printf("查找失败,待查序列中不包含该关键字\n");
  213. }
  214. printf("请输入您要插入的关键字:");
  215. scanf("%d",&n);
  216. InsertBST(T,n);
  217. printf("插入关键字 %d 后的二叉树的中序遍历:",n);
  218. InOrderTraverse(T);
  219. printf("\n");
  220. printf("请输入您要删除的关键字:");
  221. scanf("%d",&n);
  222. if (DeleteBST(T,n))
  223. {
  224. printf("删除关键字 %d 后的二叉树的中序遍历:",n);
  225. InOrderTraverse(T);
  226. printf("\n");
  227. }
  228. else
  229. {
  230. printf("二叉树不包含关键字 %d\n!",n);
  231. }
  232. return 0;
  233. }


 

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/17268233

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。