AVL的构建(插入操作)---《数据结构》严蔚敏

前端之家收集整理的这篇文章主要介绍了AVL的构建(插入操作)---《数据结构》严蔚敏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. // exam1.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. #define LH -1
  9. #define EH 0
  10. #define RH 1
  11.  
  12. typedef struct BSTNode
  13. {
  14. int data;
  15. int bf;
  16. struct BSTNode *lchild,*rchild;
  17. }BSTNode,*BSTree;
  18.  
  19. void R_Rotate(BSTree &p)
  20. {
  21. BSTree lc;
  22.  
  23. lc=p->lchild;
  24. p->lchild=lc->rchild;
  25. lc->rchild=p;
  26. p=lc;
  27.  
  28. return;
  29. }
  30.  
  31. void L_Rotate(BSTree &p)
  32. {
  33. BSTree rc;
  34.  
  35. rc=p->rchild;
  36. p->rchild=rc->lchild;
  37. rc->lchild=p;
  38. p=rc;
  39.  
  40. return;
  41. }
  42.  
  43. void LeftBalance(BSTree &T)
  44. {
  45. BSTree lc;
  46. lc=T->lchild;
  47.  
  48. switch(lc->bf)
  49. {
  50. case LH:
  51. T->bf=EH;
  52. lc->bf=EH;
  53. R_Rotate(T);
  54. break;
  55. case RH:
  56. BSTree rd;
  57. rd=lc->rchild;
  58. switch(rd->bf)
  59. {
  60. case LH:
  61. T->bf=RH;
  62. lc->bf=EH;
  63. break;
  64. case EH:
  65. T->bf=lc->bf=EH;
  66. break;
  67. case RH:
  68. lc->bf=LH;
  69. T->bf=EH;
  70. break;
  71. }
  72. rd->bf=EH;
  73. L_Rotate(lc);
  74. R_Rotate(T);
  75. }
  76. }
  77.  
  78. void RightBalance(BSTree &T)
  79. {
  80. BSTree rc;
  81.  
  82. rc=T->rchild;
  83. switch(rc->bf)
  84. {
  85. case RH:
  86. T->bf=EH;
  87. rc->bf=EH;
  88. L_Rotate(T);
  89. break;
  90. case LH:
  91. BSTree ld;
  92. ld=rc->lchild;
  93. switch(ld->bf)
  94. {
  95. case LH:
  96. T->bf=EH;
  97. rc->bf=RH;
  98. break;
  99. case EH:
  100. T->bf=rc->bf=EH;
  101. break;
  102. case RH:
  103. T->bf=LH;
  104. rc->bf=EH;
  105. break;
  106. }
  107. ld->bf=EH;
  108. R_Rotate(rc);
  109. L_Rotate(T);
  110. }
  111. }
  112.  
  113. int InsertAVL(BSTree &T,int e,bool &taller)
  114. {
  115. if(!T)
  116. {
  117. T=(BSTree)malloc(sizeof(BSTNode));
  118. T->data=e;
  119. T->lchild=NULL;
  120. T->rchild=NULL;
  121. T->bf=0;
  122. taller=true;
  123. }
  124. else
  125. {
  126. if(T->data==e)
  127. {
  128. taller=false;
  129. return 0;
  130. }
  131. if(T->data>e)
  132. {
  133. if(!InsertAVL(T->lchild,e,taller))
  134. {
  135. taller=false;
  136. return 0;
  137. }
  138. if(taller)
  139. {
  140. switch(T->bf)
  141. {
  142. case LH:
  143. LeftBalance(T);
  144. taller=false;
  145. break;
  146. case EH:
  147. taller=true;
  148. T->bf=LH;
  149. break;
  150. case RH:
  151. taller=false;
  152. T->bf=EH;
  153. break;
  154. }
  155. }
  156. }
  157. else
  158. {
  159. if(!InsertAVL(T->rchild,taller))
  160. {
  161. taller=false;
  162. return 0;
  163. }
  164. if(taller)
  165. {
  166. switch(T->bf)
  167. {
  168. case LH:
  169. T->bf=EH;
  170. taller=false;
  171. break;
  172. case EH:
  173. T->bf=RH;
  174. taller=true;
  175. break;
  176. case RH:
  177. RightBalance(T);
  178. taller=false;
  179. break;
  180. }
  181. }
  182. }
  183. }
  184.  
  185. return 1;
  186. }
  187.  
  188. void InorderTraversal(BSTree node)
  189. {
  190. if(!node)
  191. {
  192. return;
  193. }
  194. else
  195. {
  196. InorderTraversal(node->lchild);
  197. cout<<node->data<<" ";
  198. InorderTraversal(node->rchild);
  199. }
  200. return;
  201. }
  202.  
  203. int main(void)
  204. {
  205. int node;
  206. bool flag=false;
  207. BSTree T=NULL;
  208.  
  209. cout<<"Please enter nodes of the BSTree..."<<endl;
  210. cout<<"Note:end with \"ctrl+z\""<<endl;
  211. while(cin>>node)
  212. {
  213. InsertAVL(T,node,flag);
  214. }
  215. cout<<"Build binary search tree OK!"<<endl;
  216.  
  217. cout<<"The Inorder traversal sequence of the BSTree is:"<<endl;
  218. InorderTraversal(T);
  219. cout<<endl;
  220.  
  221. system("pause");
  222. return 0;
  223. }

猜你在找的数据结构相关文章