经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
平衡二叉树(AVL) - 12-num
来源:cnblogs  作者:12-num  时间:2018/12/14 9:34:39  对本文有异议

AVL就是优化二叉查找树

平衡因子不大于1

左 < 根 < 右

 

具体看代码

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef struct node;
  5. typedef node * tree;
  6. struct node
  7. {
  8. int v;
  9. int heigh;
  10. tree L,R;
  11. };
  12. //获取以root为根结点的子树的当前height
  13. int getheigh(tree root)
  14. {
  15. if(root==NULL) return 0;
  16. return root->heigh;
  17. }
  18. //更新结点root的heigh
  19. void updataheigh(tree root)
  20. {
  21. //max(左孩子结点的height,有孩子结点的height)+1
  22. root->heigh=max(getheigh(root->L),getheigh(root->R))+1;
  23. }
  24. //计算平衡因子
  25. int getBalance(tree root)
  26. {
  27. //左-右
  28. return getheigh(root->L)-getheigh(root->R);
  29. }
  30. //左旋 注意原理 对于RR是root的右孩子的平衡因子是-1
  31. void L(tree &root)
  32. {
  33. tree temp;
  34. temp=root->R;
  35. root->R=temp->L;
  36. temp->L=root;
  37. updataheigh(root);
  38. updataheigh(temp);
  39. root=temp;
  40. }
  41. void R(tree &root)
  42. {
  43. tree temp;
  44. temp=root->L;
  45. root->L=temp->R;
  46. temp->R=root;
  47. updataheigh(root);
  48. updataheigh(temp);
  49. root=temp;
  50. }
  51. void insertt(tree &root,int v)
  52. {
  53. if(root==NULL){//当结点是空的时候 就是插入的时候
  54. root=new node;
  55. root->v=v;
  56. root->heigh=1;
  57. root->L=root->R=NULL;
  58. return;
  59. }
  60. if(v<root->v){
  61. insertt(root->L,v);
  62. updataheigh(root);//注意更新树高
  63. if(getBalance(root)==2){
  64. if(getBalance(root->L)==1){
  65. R(root);
  66. }
  67. else if(getBalance(root->L)==-1){
  68. L(root->L);
  69. R(root);
  70. }
  71. }
  72. }
  73. else{
  74. insertt(root->R,v);
  75. updataheigh(root);
  76. if(getBalance(root)==-2){
  77. if(getBalance(root->R)==-1){
  78. L(root);
  79. }
  80. else if(getBalance(root->R)==1){
  81. R(root->R);
  82. L(root);
  83. }
  84. }
  85. }
  86. }
  87. int main()
  88. {
  89. int n;
  90. scanf("%d",&n);
  91. int x;
  92. tree root;
  93. root=NULL;
  94. for(int i=0;i<n;i++){
  95. scanf("%d",&x);
  96. insertt(root,x);
  97. }
  98. printf("%d\n",root->v);
  99. return 0;
  100. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号