• AVLTree


      1 #include <iostream>
      2 using namespace std;
      3 
      4 struct TreeNode
      5 {
      6     char data;
      7     int heigth;
      8     TreeNode* rchild;
      9     TreeNode* lchild;
     10 };
     11 
     12 class AVLTree
     13 {
     14 public:
     15     AVLTree(){top = NULL;}
     16     TreeNode* MakeEmpty();
     17     void Delete(char elem,TreeNode* &position,bool& isdel);
     18     TreeNode* Insert(char elem,TreeNode* &position);
     19     TreeNode* IsExist(char elem);
     20     void Create();
     21 
     22     //处理之后position指向原position的左根
     23     TreeNode* SingleRotateWithLeft(TreeNode* &position);
     24     //处理之后position指向原position的右根
     25     TreeNode* SingleRotateWithRight(TreeNode* &position);
     26     TreeNode* DoubleRotateWithLeft(TreeNode* &position);
     27     TreeNode* DoubleRotateWithRight(TreeNode* &position);
     28     int Max(int n1,int n2);
     29     int Heigth(TreeNode* position);
     30 
     31 
     32 private:
     33     TreeNode* top;
     34 
     35 };
     36 
     37 //判断节点高度
     38 int AVLTree::Heigth(TreeNode* position)
     39 {
     40     if (position == NULL)
     41     {
     42         return -1;
     43     }
     44     else
     45     {
     46         int n = position->heigth;
     47         return n;
     48     }
     49 }
     50 
     51 //判断大小、
     52 int AVLTree::Max(int n1,int n2)
     53 {
     54     return (n1>n2)?n1:n2;
     55 }
     56 
     57 //左旋,左孩子作为新的根节点,新根的右孩子成为原根的左孩子,原根成为新根的右孩子
     58 TreeNode* AVLTree::SingleRotateWithLeft(TreeNode* &position)
     59 {
     60     TreeNode* pos = (position)->lchild;
     61     (position)->lchild = pos->rchild;
     62     pos->rchild = position;
     63 
     64     (position)->heigth = Max(Heigth((position)->lchild),Heigth((position)->rchild)) + 1;
     65     (pos)->heigth = Max(Heigth((pos)->lchild),Heigth((pos)->rchild)) + 1;
     66     return pos;
     67 }
     68 
     69 //右旋,右孩子作为新的根节点,新根的左孩子成为原根的右孩子,原根成为新根的左孩子
     70 TreeNode* AVLTree::SingleRotateWithRight(TreeNode* &position)
     71 {
     72     TreeNode* pos = (position)->rchild;
     73     (position)->rchild = pos->lchild;
     74     pos->lchild = position;
     75 
     76     (position)->heigth = Max(Heigth((position)->lchild),Heigth((position)->rchild)) + 1;
     77     (pos)->heigth = Max(Heigth((pos)->lchild),Heigth((pos)->rchild)) + 1;
     78     return pos;
     79 }
     80 
     81 //左侧双旋
     82 TreeNode* AVLTree::DoubleRotateWithLeft(TreeNode* &position)
     83 {
     84     position->lchild = SingleRotateWithRight(position->lchild);
     85     return SingleRotateWithLeft(position);
     86 }
     87 
     88 //右侧双旋
     89 TreeNode* AVLTree::DoubleRotateWithRight(TreeNode* &position)
     90 {
     91     position->rchild = SingleRotateWithLeft(position->rchild);
     92     return SingleRotateWithRight(position);
     93 }
     94 
     95 TreeNode* AVLTree::Insert(char elem,TreeNode* &position)
     96 {
     97     if (position == NULL)
     98     {
     99         position = new TreeNode;
    100         position->data = elem;
    101         position->lchild = position->rchild = NULL;
    102         position->heigth = 0;
    103     }
    104     else if (elem < position->data)
    105     {
    106         position->lchild = Insert(elem,position->lchild);
    107         if (Heigth(position->lchild) - Heigth(position->rchild) == 2)
    108         {
    109             if (elem < position->lchild->data)
    110             {
    111                 position = SingleRotateWithLeft(position);
    112             } 
    113             else
    114             {
    115                 position = DoubleRotateWithLeft(position);
    116             }
    117         }
    118     } 
    119     else if(elem > position->data)
    120     {
    121         position->rchild = Insert(elem,position->rchild);
    122         if (Heigth(position->rchild) - Heigth(position->lchild) == 2)
    123         {
    124             if (elem < position->rchild->data)
    125             {
    126                 position = DoubleRotateWithRight(position);
    127             } 
    128             else
    129             {
    130                 position = SingleRotateWithRight(position);
    131             }
    132         }
    133     }
    134     else
    135     {
    136         //数据已存在
    137     }
    138 
    139     position->heigth = Max(Heigth(position->lchild) , Heigth(position->rchild)) + 1;
    140     return position;
    141 }
    142 
    143 void AVLTree::Delete(char elem,TreeNode* &position,bool& isdel)
    144 {
    145     bool is_left = false;
    146     //寻找值并删除
    147     if (position == NULL)
    148     {
    149         cout<<"This elem is not existed!"<<endl;
    150         isdel = false;
    151     }
    152     else if (position->data == elem)
    153     {
    154         if (position->lchild == NULL)//包括右孩子为空和右孩子不为空
    155         {
    156             TreeNode* temp = position;
    157             position = position->rchild;
    158             delete temp;
    159             temp = NULL;
    160         }
    161         else if (position->rchild == NULL)//右孩子为空做孩子不为空
    162         {
    163             TreeNode* temp = position;
    164             position = position->lchild;
    165             delete temp;
    166             temp = NULL;
    167         }
    168         else//做右孩子都不为空
    169         {
    170             TreeNode* temp = position;
    171             temp = temp->lchild;
    172             while (temp->rchild)
    173             {
    174                 temp = temp->rchild;
    175             }
    176             position->data = temp->data;
    177             Delete(temp->data,position->lchild,isdel);
    178             is_left = true;
    179         }
    180         isdel = true;
    181     }
    182     else if (position->data > elem)
    183     {
    184         Delete(elem,position->lchild,isdel);
    185         is_left = true;
    186     } 
    187     else if(position->data < elem)
    188     {
    189         Delete(elem,position->rchild,isdel);
    190         is_left = false;
    191     }
    192 
    193     //平衡并重新制定高度
    194     if (isdel && position)
    195     {
    196         if (is_left)//删除的为左子树部分
    197         {
    198             if (Heigth(position->rchild) - Heigth(position->lchild) == 2)
    199             {
    200                 if (elem < position->rchild->data)
    201                 {
    202                     position = DoubleRotateWithRight(position);
    203                 } 
    204                 else
    205                 {
    206                     position = SingleRotateWithRight(position);
    207                 }
    208             }
    209         } 
    210         else//删除为右子树部分
    211         {
    212             if (Heigth(position->lchild) - Heigth(position->rchild) == 2)
    213             {
    214                 if (elem < position->lchild->data)
    215                 {
    216                     position = SingleRotateWithLeft(position);
    217                 } 
    218                 else
    219                 {
    220                     position = DoubleRotateWithLeft(position);
    221                 }
    222             }
    223         }
    224         //重新制定高度,position != NULL
    225         position->heigth = Max(Heigth(position->lchild) , Heigth(position->rchild)) + 1;
    226     }
    227 }
    228 
    229 void AVLTree::Create()
    230 {
    231     char a[10] = {'a','b','c','d','e','f','g','p','o','n'};
    232     for (int i = 0;i < 10; i++)
    233     {
    234         Insert(a[i],top);
    235     }
    236 
    237     //test
    238     bool bl;
    239     //     Delete('e',top,bl);
    240     //     Delete('f',top,bl);
    241     Delete('d',top,bl);
    242 }
  • 相关阅读:
    iOS万能跳转界面的方法
    CocoaPods版本更新
    iOS--开发小技巧(持续更新)
    RunTime--手势应用场景(很方便)
    牛逼的标签效果(封装好)
    直播点赞动画
    UI基础--自定义UISwitch
    StatusBar 更改状态栏颜色(ios7)
    ios版本更新提示
    IOS 两个UIImage 合成一个Image
  • 原文地址:https://www.cnblogs.com/kbe317/p/4498469.html
Copyright © 2020-2023  润新知