鱼C论坛

 找回密码
 立即注册
查看: 2823|回复: 0

[学习笔记] 《数据结构和算法》——平衡二叉树

[复制链接]
发表于 2017-8-25 15:19:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
平衡二叉树:对比于二叉排序树对于时间复杂度的不可控制,平衡二叉树有个更加稳定的时间复杂度。我们构建了一个左右子树平衡的二叉树,使每个节点的左、右二叉树的深度差值不超过1,便于遍历。
构建过程:在构建时,除了需要按照排序二叉树的构建原则,使节点的左子树的数据小于节点的数据,节点右子树的数据大于节点的数据。同时,在添加数据时,我们需要对二叉树每个节点进行一个判定,若出现一个节点的平衡因子<=-2,则将该部分进行一次左旋转,若平衡因子大于2,则进行一次右旋转。需要注意的是,若出现几个节点的平衡因子正负号不同,则需要对平衡因子正负不同的几个节点的子树进行旋转,而不能只对几个节点统一只做一次大的旋转。
代码实现:我们利用递归的办法,先根据二叉排序树的规则将新的数据插入二叉树,然后判断一次“长高”部分的节点的平衡因子是否失衡,若失衡我们则需要对失衡部分进行旋转。先对节点进行平衡因子的调整和判断,若节点的左(右)子树的平衡因子不为0,我们只需要做一次旋转即可,否则需要进行两次旋转

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. using namespace std;

  5. class Bitnode
  6. {
  7. public:
  8.         int data;
  9.         int bf=0;
  10.         Bitnode *lchild = NULL, *rchild = NULL;
  11. };

  12. void L_rotate(Bitnode *&P)
  13. {
  14.         Bitnode *L=P->lchild;
  15.         P->rchild = L->lchild;
  16.         L->rchild = P;
  17. }
  18. void R_rotate(Bitnode *&P)
  19. {
  20.         Bitnode *L = P->rchild;
  21.         P->lchild = L->rchild;
  22.         L->lchild = P;
  23. }

  24. void LeftB(Bitnode *&T)
  25. {
  26.         Bitnode *L = T->lchild, *Lr = NULL;
  27.         switch (L->bf)
  28.         {
  29.         case 1:
  30.                 T->bf = L->bf = 0;
  31.                 R_rotate(T);
  32.                 break;
  33.         case -1:
  34.                 Lr = L->rchild;
  35.                 switch (Lr->bf)
  36.                 {
  37.                 case 1:
  38.                         T->bf = -1;
  39.                         L->bf = 0;
  40.                         break;
  41.                 case 0:
  42.                         T->bf = L->bf = 0;
  43.                         break;
  44.                 case -1:
  45.                         T->bf = 0;
  46.                         L->bf = 1;
  47.                         break;
  48.                 }
  49.                 Lr->bf = 0;
  50.                 L_rotate(T->lchild);
  51.                 R_rotate(T);

  52.         }
  53. }

  54. void RightB(Bitnode *&T)
  55. {
  56.         Bitnode *R = T->rchild, *Rl = NULL;
  57.         switch (R->bf)
  58.         {
  59.         case 1:
  60.                 T->bf = R->bf = 0;
  61.                 L_rotate(T);
  62.                 break;
  63.         case -1:
  64.                 Rl = R->lchild;
  65.                 switch (Rl->bf)
  66.                 {
  67.                 case 1:
  68.                         T->bf = -1;
  69.                         R->bf = 0;
  70.                         break;
  71.                 case 0:
  72.                         T->bf = R->bf = 0;
  73.                         break;
  74.                 case -1:
  75.                         T->bf = 0;
  76.                         R->bf = 1;
  77.                         break;
  78.                 }
  79.                 Rl->bf = 0;
  80.                 R_rotate(T->lchild);
  81.                 L_rotate(T);

  82.         }
  83. }

  84. int InsertAVL(Bitnode *&T,int e,int *is)
  85. {
  86.         if (T == NULL)
  87.         {
  88.                 T = new Bitnode;
  89.                 T->data = e;
  90.                 *is = true;
  91.                 return true;
  92.         }
  93.         else
  94.         {
  95.                 if (e == T->data)
  96.                 {
  97.                         *is = false;
  98.                         return false;
  99.                 }
  100.                 if (e < T->data)
  101.                 {
  102.                         if (!InsertAVL(T->lchild, e, is))
  103.                         {
  104.                                 return false;
  105.                         }
  106.                         else
  107.                         {
  108.                                 if (*is)
  109.                                 {
  110.                                         switch (T->bf)
  111.                                         {
  112.                                         case 1:
  113.                                                 LeftB(T);//左旋节点
  114.                                                 *is = false;
  115.                                                 break;
  116.                                         case 0:
  117.                                                 T->bf = 1;
  118.                                                 *is = true;
  119.                                                 break;
  120.                                         case -1:
  121.                                                 T->bf = 0;
  122.                                                 *is = false;
  123.                                                 break;
  124.                                         }
  125.                                 }
  126.                         }
  127.                        
  128.                 }
  129.                 else
  130.                 {
  131.                         if (!InsertAVL(T->rchild, e, is))
  132.                         {
  133.                                 return false;
  134.                         }
  135.                         if (*is)
  136.                         {
  137.                                 switch (T->bf)
  138.                                 {
  139.                                 case -1:
  140.                                         RightB(T);
  141.                                         *is = false;
  142.                                         break;
  143.                                 case 0:
  144.                                         T->bf = -1;
  145.                                         *is = true;
  146.                                         break;
  147.                                 case 1:
  148.                                         T->bf = 0;
  149.                                         *is = false;
  150.                                         break;
  151.                                 }
  152.                         }
  153.                 }
  154.         }
  155. }
复制代码

评分

参与人数 1鱼币 +3 收起 理由
小甲鱼 + 3 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 15:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表