zoukankan      html  css  js  c++  java
  • AVL树

      1 #include <iostream>
      2 #include <cstdlib>
      3 using namespace std;
      4 struct node
      5 {
      6     int v;
      7     int df;
      8     node * left_c;
      9     node * right_c;
     10 };
     11 void right_rotate(node *&ptr)
     12 {
     13     if (ptr->right_c->df==-1)
     14     {
     15         node * child = ptr->right_c;
     16         ptr->right_c = child ->left_c;
     17         child ->left_c = ptr;
     18         ptr->df = 0;
     19         child->df = 0;
     20         ptr = child;
     21     }
     22     else
     23     {
     24        node * child = ptr->right_c;
     25        node * g_child = child ->left_c;
     26        child ->left_c = g_child ->right_c;
     27        ptr->right_c = g_child -> left_c;
     28        g_child->left_c = ptr;
     29        g_child->right_c = child;
     30        switch(g_child->df)
     31        {
     32        case 0:ptr->df = 0;child->df =0;break;
     33        case 1:ptr->df = 0; child->df = -1;g_child->df = 0;break;
     34        case -1:ptr->df = 1; child->df = 0;g_child->df = 0;break;
     35        }
     36        ptr = g_child;
     37     }
     38 }
     39 void left_rotate(node *&ptr)
     40 {
     41     if (ptr->left_c->df==1) // LL型旋转
     42     {
     43         // ptr 的左二子成为老子 ptr成为其右儿子
     44         node * child = ptr->left_c;
     45         ptr->left_c = child ->right_c;
     46         child ->right_c = ptr;
     47         ptr->df = 0;
     48         child->df = 0;
     49         ptr = child;
     50     }
     51     else // LR型旋转
     52     {
     53        node * child = ptr->left_c; // L儿子
     54        node * g_child = child ->right_c; // LR 孙子
     55        
     56        // 孙子的两个儿子 根据 二叉查找树定义 分别给 child 和 ptr
     57        child ->right_c = g_child ->left_c;
     58        ptr->left_c = g_child -> right_c;
     59        //孙子成为老子
     60        g_child->right_c = ptr;
     61        g_child->left_c = child;
     62        //根据孙子的df调整各点
     63        switch(g_child->df)
     64        {
     65        case 0:ptr->df = 0;child->df =0;break; 
     66        case -1:ptr->df = 0; child->df = 1;g_child->df = 0;break;
     67        case 1:ptr->df = -1; child->df = 0;g_child->df = 0;break;
     68        }
     69        ptr = g_child;
     70     }
     71 }
     72 void avl_insert(node * &ptr ,int t,bool &if_b)
     73 {
     74     if (ptr == NULL) // 新节点
     75     {
     76         if_b = false;
     77         ptr = (node *)malloc(sizeof(node));
     78         ptr->df = 0;
     79         ptr->left_c = NULL;
     80         ptr->right_c = NULL;
     81         ptr->v = t;
     82     }
     83     else if (t > ptr->v) // 与左子树完全对称
     84     {
     85         avl_insert(ptr->right_c,t,if_b);
     86         if (!if_b)
     87         {
     88             switch(ptr->df)
     89             {
     90                 case 0:ptr->df = -1;break;
     91                 case 1:ptr->df = 0;if_b = true; break;
     92                 case -1:right_rotate(ptr);if_b = true;break;
     93             }
     94         }
     95     }
     96     else if (t < ptr->v) // 在左子树中加入
     97     {
     98         avl_insert(ptr->left_c,t,if_b);
     99         if (!if_b)
    100         {
    101             switch(ptr->df)
    102             {
    103                 case 0:ptr->df = 1;break;//不平衡
    104                 case -1:ptr->df = 0;if_b = true; break; //恰好调节平衡
    105                 case 1:left_rotate(ptr);if_b = true;break; //旋转后调节平衡
    106             }
    107         }
    108     }
    109     else // 找到元素
    110     {
    111         cout <<t <<"cunzai"<<endl;
    112         if_b = true;
    113         return;
    114     }
    115 }
    116 void proorder(node * ptr) //中序遍历
    117 {
    118     if (ptr ==NULL) return;
    119     proorder(ptr->left_c);
    120     cout << ptr->v <<" ";
    121     proorder(ptr->right_c);
    122 }
    123 int main()
    124 {
    125     int N;
    126     cin >> N;
    127     node* root = NULL;
    128     bool if_b = false;
    129     for (int i = 1 ; i<=N; i++)
    130     {
    131         int x;
    132         cin >> x;
    133         if_b = false;
    134         avl_insert(root,x,if_b);
    135     }
    136     proorder(root);
    137     cout <<endl;
    138 }
  • 相关阅读:
    代码301的弊端和处理方法
    seo如何发外链
    seo工程师是什么,需要什么技能?
    优化一个关键词到百度首页需要多少钱
    搜索引擎优化顾问机构好不好
    谷歌分析(GA)新版的有哪些改变
    什么是相关性链接/网站相关性
    JS的部分部分疑问和小结
    Groovy学习:第一章 用Groovy简化Java代码
    SpringMVC学习(8):国际化
  • 原文地址:https://www.cnblogs.com/HITLJR/p/6230474.html
Copyright © 2011-2022 走看看