当前位置:   article > 正文

平衡二叉树 C语言代码实现

平衡二叉排序树代码

    关注、星标公众号,直达精彩内容

8d9b2fe783cc96211a7f8629f1f64a30.png

来源: https://www.cnblogs.com/NoneID

整理:李肖遥

1. 什么是平衡二叉树

平衡二叉树,我们也称【二叉平衡搜索树/AVL】,树中任何节点的两个子树的高度最大差别为1,巴拉巴拉。。。(https://baike.baidu.com/item/AVL树/10986648?fr=aladdin)

但是有个注意的点: 平衡二叉树的前提是 二叉排序树(https://baike.baidu.com/item/二叉搜索树/7077855?fr=aladdin)

这篇博客主要总结平衡二叉树,所以,二叉排序树知识不会提及,但是会用到。

如果想要看 排序二叉树调整为 平衡二叉树 旋转相关内容的,调整至 第5节。

平衡二叉树

b64583b3cce4556aa23f42a4b6ad26e6.png

非平衡二叉树

最小不平衡子树节点为 130

左子树深度为 1,右子树深度为3 ,其差值大于1,所以不平衡

dcc3aa4b828f38918eebfa0cb7515b65.png

2. 如何判断二叉树最小不平衡子树

最小不平衡子树为 130 这颗子树(黄色标注)

da8f14c8fc8a0061f77e7169ffd62050.png

判定最小不平衡子树的关键就在于,判断 这棵树的左子树 和 右字数 深度之差是否大于1,若大于1 ,则证明该树不平衡

检查二叉树是否平衡函数代码实现

  1. typedef struct {
  2. int data; // 数据节点
  3. struct TreeNode *left; // 指向左子树
  4. struct TreeNode *right; // 指向右子树
  5. } TreeNode , *PTreeNode;
  6. // 记录平衡二叉树
  7. bool BalanceTrue = false;
  8. // 最小不平衡子树地址
  9. TreeNode *rjt = NULL;
  10. // 检查二叉树是否平衡,若不平衡 BalanceTrue 为 true
  11. int checkTreeBalance(TreeNode *root) {
  12. if (NULL == root) { return 0; }
  13. int x = checkTreeBalance(root->left);
  14. int y = checkTreeBalance(root->right);
  15. // 若检测到最小不平衡二叉树后,不进行后面的检查
  16. if (BalanceTrue) return 0;
  17. int xx = abs(x-y);
  18. if (xx > 1) {
  19. // 左子树 和 右子树 相差大于1 , 二叉树不平衡
  20. BalanceTrue = true;
  21. rjt = root;
  22. }
  23. return (x>y?x+1:y+1);
  24. }

程序执行结果

  1. # gcc -w -g -std=c11 BalanceTree.c
  2. #
  3. # ./a.out
  4. 当前二叉树遍历
  5. 前序遍历: 580 130 80 160 150 158 210 1590 900 2100 1900
  6. 中序遍历: 80 130 150 158 160 210 580 900 1590 1900 2100
  7. 二叉树不平衡,不平衡子树根节点为: 130
  8. #

3. 二叉树不平衡情况

在一颗平衡二叉树的前提下,插入和删除一个节点,都有可能会引起二叉树不平衡,不平衡的情况主要有以下四种

左左更高

9b27fb9d13bac586ada905053b889c5a.png

左右更高

177f9a2e9f1241220118cbffe08999ab.png

右左更高

7554f1d6eb4020f74125726f3fa19013.png

右右更高

e2af5a9259b569dc185ab3cb58d0b624.png

4. 判断不平衡二叉树哪边高

3257489a8fdde4398da155f3faf211e6.png

16b074aa021e6882a61c661a89f8f495.png

如上图红色所示,可以先根据最小不平衡二叉树左子树或者右子树高,上图所示,为右子树高,则将最小不平衡二叉树的右子树作为树根节点,继续判断子树的左子树或者右子树高。
比如上图的结果是右左较高,若进行调整的话,为 先让不平衡子树右节点的树先向右旋转,然后再向左旋转

判断不平衡二叉树哪边高代码实现

  1. typedef struct {
  2. int data; // 数据节点
  3. struct TreeNode *left; // 指向左子树
  4. struct TreeNode *right; // 指向右子树
  5. } TreeNode , *PTreeNode;
  6. // 记录平衡二叉树
  7. bool BalanceTrue = false;
  8. // 最小不平衡子树地址
  9. TreeNode *rjt = NULL;
  10. // 返回二叉树树高
  11. int treeHeight(TreeNode *root) {
  12. if (NULL == root) return 0;
  13. int ll = treeHeight(root->left);
  14. int rr = treeHeight(root->right);
  15. return (ll>rr?ll+1:rr+1);
  16. }
  17. int main() {
  18. /* 构建二叉树
  19. 判断平衡,获取最小不平衡子树, 将数据存入 rjt 中
  20. 输出二叉树 前序/中序
  21. */
  22. if (BalanceTrue) {
  23. printf("二叉树不平衡,不平衡子树根节点为: %d\n",rjt->data);
  24. } else {
  25. return 0;
  26. };
  27. int ll = treeHeight(rjt->left);
  28. int rr = treeHeight(rjt->right);
  29. if (1 < ll - rr) {
  30. printf("左子树高\n");
  31. TreeNode *rjt_ll = rjt->left;
  32. int child_ll = treeHeight(rjt_ll->left);
  33. int child_rr = treeHeight(rjt_ll->right);
  34. if (child_ll > child_rr) {
  35. printf("左子树更高\n");
  36. } else if (child_rr > child_ll) {
  37. printf("右字数更高");
  38. }
  39. } else if (1 < rr - ll) {
  40. printf("右子数高\n");
  41. TreeNode *rjt_rr = rjt->right;
  42. int child_ll = treeHeight(rjt_rr->left);
  43. int child_rr = treeHeight(rjt_rr->right);
  44. if (child_ll > child_rr) {
  45. printf("左子树更高\n");
  46. } else if (child_rr > child_ll) {
  47. printf("右字数更高");
  48. }
  49. }
  50. return 0;
  51. }

输出

  1. # gcc BalanceTree.c -w -g -std=c11
  2. #
  3. # ./a.out
  4. 当前二叉树遍历
  5. 前序遍历:130 80 160 150 158 210
  6. 中序遍历:80 130 150 158 160 210
  7. 二叉树不平衡,不平衡子树根节点为: 130
  8. 右子数高
  9. 左子树更高
  10. #

5. 如何调整平衡二叉树

所谓的旋转,其实是修改指针指向的值,仅此而已。

二叉树不平衡有四种情况

左左更高

原始二叉树,若要调整为平衡二叉树,需要整棵树向右旋转

0492602ec98d6ec79902b3b3b61a3fb7.png

调整1:整棵树向右旋转

39a9121ef08a5d9d9d5d6f2a6c4acb18.png

左右更高

原始二叉树,若要调整为平衡二叉树,需要 先让不平衡子树左节点先向左旋转,然后再向右旋转

4ef34bbc812afe2f2aa1c429040707ff.png

调整1: 先让不平衡子树左节点的树先向左旋转

4c3ce0bdc50d961e33620b288f03bc84.png

调整2: 整棵树向右

0f9a3039625175647870bd735706e8f2.png

右左更高

原始二叉树,若要调整为平衡二叉树,需要 先让不平衡子树右节点的树先向右旋转,然后再向左旋转

174bbbbbf2b44a1bf6e91c6f5a0a46e1.png

调整1: 先让不平衡子树右节点的树先向右旋转

e634c931e1515a6caae92edfd1379129.png

调整2: 整棵树向左

34032edb8d854743ffd993acf1a875fd.png

右右更高

原始二叉树,若要调整为平衡二叉树,需要 整棵树向左旋转

b12228ef9f702850280f3ce64f6bc0e6.png

调整1: 整棵树向左旋转

ed8a260be2583f74dc6041df2c41cf47.png

全部代码

  1. # include <stdio.h>
  2. # include <stdbool.h>
  3. # include <stdlib.h>
  4. # include <math.h>
  5. typedef struct {
  6. int data; // 数据节点
  7. struct TreeNode *left; // 指向左子树
  8. struct TreeNode *right; // 指向右子树
  9. } TreeNode , *PTreeNode;
  10. // 记录平衡二叉树
  11. bool BalanceTrue = false;
  12. // 最小不平衡子树地址
  13. TreeNode *rjt = NULL;
  14. // 检查二叉树是否平衡,若不平衡 BalanceTrue 为 true
  15. int checkTreeBalance(TreeNode *root) {
  16. if (NULL == root) { return 0; }
  17. int x = checkTreeBalance(root->left);
  18. int y = checkTreeBalance(root->right);
  19. // 若检测到最小二叉树后,不进行后面的检查
  20. if (BalanceTrue) return 0;
  21. int xx = abs(x-y);
  22. if (xx > 1) {
  23. // 左子树 和 右子树 相差大于1 , 二叉树不平衡
  24. BalanceTrue = true;
  25. rjt = root;
  26. }
  27. return (x>y?x+1:y+1);
  28. }
  29. // 返回二叉树树高
  30. int treeHeight(TreeNode *root) {
  31. if (NULL == root) return 0;
  32. int ll = treeHeight(root->left);
  33. int rr = treeHeight(root->right);
  34. return (ll>rr?ll+1:rr+1);
  35. }
  36. // 父节点查询
  37. TreeNode* queryTopData(TreeNode *root,int data) {
  38. // 空地址异常抛出
  39. if (NULL == root) return NULL;
  40. // top: 父节点 ,如果为Null, 该节点为父节点
  41. // tmp: 遍历查询节点
  42. TreeNode *top = NULL;
  43. TreeNode *tmp = root;
  44. while (tmp != NULL) {
  45. if (data == tmp->data) {
  46. // 节点为 返回Null
  47. if (NULL == top) return NULL;
  48. return top;
  49. }
  50. top = tmp;
  51. if (data > tmp->data) {
  52. tmp = tmp->right;
  53. } else if (data < tmp->data) {
  54. tmp = tmp->left;
  55. }
  56. }
  57. return NULL;
  58. }
  59. // 左左旋转
  60. //
  61. // 不平衡二叉树
  62. // 70
  63. // / \
  64. // 50 80
  65. // / \
  66. // 40 60
  67. // /
  68. // 30
  69. //
  70. // 旋转后平衡二叉树(向右旋转)
  71. //
  72. // 50
  73. // / \
  74. // 40 70
  75. // / / \
  76. //30 60 80
  77. //
  78. bool turnLL(TreeNode **root , TreeNode *notBalanceRoot) {
  79. if ((*root) != notBalanceRoot) {
  80. printf("左左旋转,非根节点\n");
  81. // 非根节点
  82. TreeNode *lleft = notBalanceRoot->left;
  83. TreeNode *lright = lleft->right;
  84. // 查找父节点
  85. TreeNode *fdata = queryTopData((*root),notBalanceRoot->data);
  86. if (NULL == fdata) return false;
  87. lleft->right = notBalanceRoot;
  88. notBalanceRoot->left = lright;
  89. if (notBalanceRoot == fdata->left) {
  90. fdata->left = lleft;
  91. } else if (notBalanceRoot == fdata->right) {
  92. fdata->right = lleft;
  93. }
  94. return true;
  95. } else {
  96. // 根节点
  97. printf("左左旋转,是根节点\n");
  98. TreeNode *lleft = notBalanceRoot->left;
  99. TreeNode *absroot = lleft;
  100. TreeNode *lright = lleft->right;
  101. lleft->right = notBalanceRoot;
  102. notBalanceRoot->left = lright;
  103. (*root) = absroot;
  104. return true;
  105. }
  106. }
  107. // 左右旋转
  108. //不平衡二叉树
  109. // 70
  110. // / \
  111. // 50 80
  112. // / \
  113. // 40 60
  114. // /
  115. // 55
  116. //
  117. //左子树向左
  118. // 70
  119. // / \
  120. // 60 80
  121. // /
  122. // 50
  123. // / \
  124. // 40 55
  125. //
  126. //
  127. // 整棵树向右
  128. //
  129. // 60
  130. // / \
  131. // 50 70
  132. // / \ \
  133. // 40 55 80
  134. //
  135. bool turnLR(TreeNode **root , TreeNode *notBalanceRoot) {
  136. if ((*root) != notBalanceRoot) {
  137. printf("左右旋转,非根节点");
  138. TreeNode *lleft = notBalanceRoot->left;
  139. TreeNode *leftRight = lleft->right;
  140. TreeNode *leftRightLeft = leftRight->left;
  141. // 第一次调整
  142. leftRight->left = lleft;
  143. lleft->right = leftRightLeft;
  144. notBalanceRoot->left = leftRight;
  145. // 查找父节点
  146. TreeNode *fdata = queryTopData((*root),notBalanceRoot->data);
  147. //if (NULL != fdata) printf("fdata: %d\n",fdata->data);
  148. // 第二次调整
  149. lleft = notBalanceRoot->left;
  150. leftRight = lleft->right;
  151. lleft->right = notBalanceRoot;
  152. notBalanceRoot->left = leftRight;
  153. if (notBalanceRoot == fdata->left) {
  154. fdata->left = lleft;
  155. } else if (notBalanceRoot == fdata->right) {
  156. fdata->right = lleft;
  157. }
  158. } else {
  159. printf("左右旋转,是根节点\n");
  160. TreeNode *lleft = notBalanceRoot->left;
  161. TreeNode *leftRight = lleft->right;
  162. TreeNode *leftRightLeft = leftRight->left;
  163. // 第一次调整
  164. leftRight->left = lleft;
  165. lleft->right = leftRightLeft;
  166. notBalanceRoot->left = leftRight;
  167. // 第二次调整
  168. lleft = notBalanceRoot->left;
  169. leftRight = lleft->right;
  170. lleft->right = notBalanceRoot;
  171. notBalanceRoot->left = leftRight;
  172. (*root) = lleft;
  173. }
  174. }
  175. // 右左旋转
  176. //不平衡二叉树
  177. // 70
  178. // / \
  179. // 50 80
  180. // / \
  181. // 75 88
  182. // \
  183. // 77
  184. //
  185. //左子树向右
  186. // 70
  187. // / \
  188. // 50 75
  189. // / \
  190. // 77 80
  191. // \
  192. // 88
  193. //
  194. //
  195. //
  196. //整棵树向左
  197. // 75
  198. // / \
  199. // 70 80
  200. // / \ \
  201. // 50 77 88
  202. //
  203. bool turnRL(TreeNode **root , TreeNode *notBalanceRoot) {
  204. TreeNode *rright = notBalanceRoot->right;
  205. TreeNode *rightLeft = rright->left;
  206. TreeNode *rightLeftRight = rightLeft->right;
  207. // 第一次调整
  208. rightLeft->right = rright;
  209. rright->left = rightLeftRight;
  210. notBalanceRoot->right = rightLeft;
  211. // 查找父节点
  212. TreeNode *fdata = queryTopData((*root),notBalanceRoot->data);
  213. //if (NULL != fdata) printf("fdata: %d\n",fdata->data);
  214. // 第二次调整
  215. rright = notBalanceRoot->right;
  216. rightLeft = rright->left;
  217. rright->left = notBalanceRoot;
  218. notBalanceRoot->right = rightLeft;
  219. if ((*root) != notBalanceRoot) {
  220. printf("右左旋转,非根节点\n");
  221. if (notBalanceRoot == fdata->left) {
  222. fdata->left = rright;
  223. } else if (notBalanceRoot == fdata->right) {
  224. fdata->right = rright;
  225. }
  226. } else {
  227. printf("右左旋转,是根节点\n");
  228. (*root) = rright;
  229. }
  230. }
  231. // 右右旋转
  232. //
  233. // 不平衡二叉树
  234. // 70
  235. // / \
  236. //50 80
  237. // / \
  238. // 75 88
  239. // /
  240. // 85
  241. //
  242. //
  243. //
  244. //向左旋转
  245. // 80
  246. // / \
  247. // 70 88
  248. // / \ /
  249. //50 75 85
  250. bool turnRR(TreeNode **root , TreeNode *notBalanceRoot) {
  251. if ((*root) != notBalanceRoot) {
  252. printf("右右旋转,非根节点");
  253. TreeNode *rright = notBalanceRoot->right;
  254. TreeNode *rleft = rright->left;
  255. // 查找父节点
  256. TreeNode *fdata = queryTopData((*root),notBalanceRoot->data);
  257. if (NULL != fdata) printf("fdata: %d\n",fdata->data);
  258. rright->left = notBalanceRoot;
  259. notBalanceRoot->right = rleft;
  260. if (notBalanceRoot == fdata->left) {
  261. fdata->left = rright;
  262. } else if (notBalanceRoot == fdata->right) {
  263. fdata->right = rright;
  264. }
  265. } else {
  266. // 右右旋转,是根节点
  267. printf("右右旋转,是根节点\n");
  268. TreeNode *rright = notBalanceRoot->right;
  269. TreeNode *absroot = rright;
  270. TreeNode *rleft = rright->left;
  271. rright->left = notBalanceRoot;
  272. notBalanceRoot->right = rleft;
  273. (*root) = absroot;
  274. }
  275. }
  276. // 二叉树前序遍历
  277. void Print1(TreeNode *root) {
  278. if (NULL == root) return;
  279. printf("%d\t",root->data);
  280. Print1(root->left);
  281. Print1(root->right);
  282. }
  283. // 二叉树中序遍历
  284. void Print2(TreeNode *root) {
  285. if (NULL == root) return;
  286. Print2(root->left);
  287. printf("%d\t",root->data);
  288. Print2(root->right);
  289. }
  290. // 二叉树后续遍历
  291. void Print3(TreeNode *root) {
  292. if (NULL == root) return;
  293. Print3(root->left);
  294. Print3(root->right);
  295. printf("%d\t",root->data);
  296. }
  297. // 插入二叉树节点
  298. TreeNode* addNode(TreeNode *root,int data) {
  299. if (NULL == root) {
  300. // 头节点插入
  301. TreeNode *Node = (TreeNode *)malloc(sizeof(TreeNode));
  302. if (NULL == Node) {
  303. printf("新节点申请内存失败\n");
  304. return NULL;
  305. }
  306. Node->data = data;
  307. return Node;
  308. }
  309. TreeNode *tmp = root;
  310. TreeNode *top = NULL;
  311. // 找到合适的最尾巴节点
  312. while (NULL != tmp) {
  313. top = tmp;
  314. if (tmp->data == data) {
  315. printf("已经存在该节点,节点地址: %p\n",tmp);
  316. return root;
  317. }
  318. if (tmp->data < data) {
  319. tmp = tmp->right;
  320. } else if (tmp->data > data) {
  321. tmp = tmp->left;
  322. }
  323. }
  324. TreeNode *Node = (TreeNode *)malloc(sizeof(TreeNode));
  325. Node->data = data;
  326. if (NULL == Node) {
  327. printf("申请新节点内存失败\n");
  328. return root;
  329. }
  330. // 链接节点
  331. if (data > top->data) {
  332. top->right = Node;
  333. } else if (data < top->data) {
  334. top->left = Node;
  335. }
  336. return root;
  337. }
  338. // 删除二叉排序树节点
  339. bool DeleteTreeNode(TreeNode **TreeRoot,int data) {
  340. if (NULL == (*TreeRoot)) return false;
  341. printf("删除节点: %d\n",data);
  342. TreeNode *tmp = (*TreeRoot);
  343. TreeNode *top = NULL;
  344. while (tmp != NULL) {
  345. if (tmp->data == data) {
  346. // 叶子节点
  347. if ((NULL == tmp->left) && (NULL == tmp->right)) {
  348. // 叶子节点
  349. if (NULL == top) {
  350. // 仅有根节点的叶子节点
  351. free(tmp);
  352. return true;
  353. } else {
  354. // 其他的叶子节点
  355. TreeNode *lastNode = top;
  356. if (tmp == lastNode->left) {
  357. lastNode->left = NULL;
  358. } else if (tmp == lastNode->right) {
  359. lastNode->right = NULL;
  360. }
  361. free(tmp);
  362. return true;
  363. }
  364. } else {
  365. // 非叶子节点
  366. // 算法为:
  367. // 默认算法为: 1. 当删除该节点时,获取该树右子树最左子节点
  368. // 2. 当右子树为空时,此时应该获取左子树最右端子节点
  369. if (NULL != tmp->right) {
  370. // 方案 1
  371. TreeNode *tmp2 = tmp->right;
  372. TreeNode *top2 = NULL;
  373. // 找到最后一个节点
  374. while (tmp2->left != NULL) {
  375. top2 = tmp2;
  376. tmp2 = tmp2->left;
  377. }
  378. // 删除老的节点
  379. tmp->data = tmp2->data;
  380. // 只有右子树节点 没有左子树节点
  381. if (NULL == top2) {
  382. tmp->right = NULL;
  383. } else {
  384. top2->left = NULL;
  385. }
  386. free(tmp2);
  387. } else {
  388. // 方案 2
  389. TreeNode *tmp2 = tmp->left;
  390. TreeNode *top2 = NULL;
  391. // 找到最后一个节点
  392. while (tmp2->right != NULL) {
  393. tmp2 = tmp2->right;
  394. }
  395. // 删除老的节点
  396. tmp->data = tmp2->data;
  397. if (NULL == top2) {
  398. tmp->left = NULL;
  399. } else {
  400. top2->right = NULL;
  401. }
  402. free(tmp2);
  403. }
  404. }
  405. } else {
  406. top = tmp;
  407. if (data > tmp->data) {
  408. tmp = tmp->right;
  409. } else {
  410. tmp = tmp->left;
  411. }
  412. }
  413. }
  414. return false;
  415. }
  416. // 二叉树平衡调整
  417. bool treeBalance(TreeNode **root) {
  418. checkTreeBalance((*root));
  419. while (BalanceTrue) {
  420. printf("二叉树不平衡,最小不平衡子树数据结点: %d\n",rjt->data);
  421. TreeNode *tmp;
  422. if (1 < treeHeight(rjt->left) - treeHeight(rjt->right)) {
  423. // 对于不平衡二叉树而言,左子树比右子树高
  424. //
  425. //printf("左\n");
  426. if (rjt->left != NULL) {
  427. tmp = rjt->left;
  428. int ll = treeHeight(tmp->left);
  429. int rr = treeHeight(tmp->right);
  430. if (ll > rr) {
  431. // 对于不平衡子树 左子树 而言, 左子树比右子树高
  432. // 左左旋转
  433. turnLL(root,rjt);
  434. } else {
  435. // 对于不平衡子树 左子树 而言, 右子树比左子树高
  436. // 左右旋转
  437. //
  438. turnLR(root ,rjt);
  439. }
  440. }
  441. } else if (1 < treeHeight(rjt->right) - treeHeight(rjt->left)) {
  442. // 对于不平衡二叉树而言,右子树比左子树高
  443. //
  444. //printf("右\n");
  445. if (rjt->right != NULL) {
  446. tmp = rjt->right;
  447. int ll = treeHeight(tmp->left);
  448. int rr = treeHeight(tmp->right);
  449. if (ll > rr) {
  450. //右左旋转
  451. turnRL(root,rjt);
  452. } else {
  453. //右右旋转
  454. turnRR(root,rjt);
  455. }
  456. }
  457. }
  458. BalanceTrue = false;
  459. checkTreeBalance((*root));
  460. printf("二叉树调整平衡后数据结点:\n");
  461. printf("前序遍历:");
  462. Print1(*root);
  463. printf("\n");
  464. printf("中序遍历:");
  465. Print2(*root);
  466. printf("\n");
  467. printf("\n");
  468. }
  469. }
  470. int main() {
  471. TreeNode *root = NULL;
  472. printf("平衡二叉树插入测试\n");
  473. int nums[] = {65,60,70,55,40,63,69,66,68,77};
  474. int i;
  475. for (i=0;i<sizeof(nums)/sizeof(int);i++) {
  476. printf("插入数据: %d\n",nums[i]);
  477. root = addNode(root,nums[i]);
  478. if (NULL == root) {
  479. printf("首节点申请失败");
  480. return -1;
  481. }
  482. treeBalance(&root);
  483. sleep(1);
  484. }
  485. printf("\n当前二叉树遍历\n");
  486. printf("前序遍历:");
  487. Print1(root);
  488. printf("\n");
  489. printf("中序遍历:");
  490. Print2(root);
  491. printf("\n");
  492. //return 0;
  493. printf("\n\n平衡二叉树删除测试\n");
  494. for (i=2;i<5;i++) {
  495. DeleteTreeNode(&root,nums[i]);
  496. treeBalance(&root);
  497. sleep(1);
  498. }
  499. printf("\n当前二叉树遍历\n");
  500. printf("前序遍历:");
  501. Print1(root);
  502. printf("\n");
  503. printf("中序遍历:");
  504. Print2(root);
  505. printf("\n");
  506. return 0;
  507. }

程序执行结果

  1. # gcc BalanceTree.c -w -g -std=c11
  2. #
  3. # ./a.out
  4. 平衡二叉树插入测试
  5. 插入数据: 65
  6. 插入数据: 60
  7. 插入数据: 70
  8. 插入数据: 55
  9. 插入数据: 40
  10. 二叉树不平衡,最小不平衡子树数据结点: 60
  11. 左左旋转,非根节点
  12. 二叉树调整平衡后数据结点:
  13. 前序遍历:65 55 40 60 70
  14. 中序遍历:40 55 60 65 70
  15. 插入数据: 63
  16. 二叉树不平衡,最小不平衡子树数据结点: 65
  17. 左右旋转,是根节点
  18. 二叉树调整平衡后数据结点:
  19. 前序遍历:60 55 40 65 63 70
  20. 中序遍历:40 55 60 63 65 70
  21. 插入数据: 69
  22. 插入数据: 66
  23. 二叉树不平衡,最小不平衡子树数据结点: 70
  24. 左左旋转,非根节点
  25. 二叉树调整平衡后数据结点:
  26. 前序遍历:60 55 40 65 63 69 66 70
  27. 中序遍历:40 55 60 63 65 66 69 70
  28. 插入数据: 68
  29. 二叉树不平衡,最小不平衡子树数据结点: 65
  30. 右左旋转,非根节点
  31. 二叉树调整平衡后数据结点:
  32. 前序遍历:60 55 40 66 65 63 69 68 70
  33. 中序遍历:40 55 60 63 65 66 68 69 70
  34. 插入数据: 77
  35. 二叉树不平衡,最小不平衡子树数据结点: 60
  36. 右右旋转,是根节点
  37. 二叉树调整平衡后数据结点:
  38. 前序遍历:66 60 55 40 65 63 69 68 70 77
  39. 中序遍历:40 55 60 63 65 66 68 69 70 77
  40. 当前二叉树遍历
  41. 前序遍历:66 60 55 40 65 63 69 68 70 77
  42. 中序遍历:40 55 60 63 65 66 68 69 70 77
  43. 平衡二叉树删除测试
  44. 删除节点: 70
  45. 删除节点: 55
  46. 删除节点: 40
  47. 二叉树不平衡,最小不平衡子树数据结点: 60
  48. 右左旋转,非根节点
  49. 二叉树调整平衡后数据结点:
  50. 前序遍历:66 63 60 65 69 68 77
  51. 中序遍历:60 63 65 66 68 69 77
  52. 当前二叉树遍历
  53. 前序遍历:66 63 60 65 69 68 77
  54. 中序遍历:60 63 65 66 68 69 77
  55. #

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/632120
推荐阅读
相关标签
  

闽ICP备14008679号