zoukankan      html  css  js  c++  java
  • AVL树 (PAT甲级 Is It a Complete AVL Tree )

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 struct node
      4 {
      5     int data;
      6     node *left;
      7     node *right;
      8     int height;
      9 };
     10 typedef node *AVL;
     11 int get_height(AVL T)
     12 {
     13     if (T == NULL)
     14         return -1;
     15     else
     16         return T->height;
     17 }
     18 
     19 void update_height(AVL T)
     20 {
     21     T->height = max(get_height(T->left), get_height(T->right)) + 1;
     22 }
     23 
     24 AVL single_left(AVL k2)
     25 {
     26     AVL k1 = k2->left;
     27     k2->left = k1->right;
     28     k1->right = k2;
     29     update_height(k2);
     30     update_height(k1);
     31     return k1;
     32 }
     33 
     34 AVL single_right(AVL k2)
     35 {
     36     AVL k1 = k2->right;
     37     k2->right = k1->left;
     38     k1->left = k2;
     39     update_height(k2);
     40     update_height(k1);
     41     return k1;
     42 }
     43 
     44 AVL double_left(AVL k1)
     45 {
     46     k1->left = single_right(k1->left);
     47     return single_left(k1);
     48 }
     49 
     50 AVL double_right(AVL k1)
     51 {
     52     k1->right = single_left(k1->right);
     53     return single_right(k1);
     54 }
     55 
     56 AVL insert(int x, AVL T)
     57 {
     58     if (T == NULL)
     59     {
     60         AVL T = new node;
     61         T->data = x;
     62         T->height = 0;
     63         T->left = T->right = NULL;
     64         return T;
     65     }
     66     if (x < T->data)
     67     {
     68 
     69         T->left = insert(x, T->left);
     70         if (get_height(T->left) - get_height(T->right) == 2)
     71         {
     72             if (x < T->left->data)
     73                 T = single_left(T);
     74             else
     75                 T = double_left(T);
     76         }
     77     }
     78     else
     79     {
     80         T->right = insert(x, T->right);
     81         if (get_height(T->right) - get_height(T->left) == 2)
     82         {
     83             if (x < T->right->data)
     84                 T = double_right(T);
     85             else
     86                 T = single_right(T);
     87         }
     88     }
     89     update_height(T);
     90     return T;
     91 }
     92 bool flag,isok; int tnum=3;
     93 void lev_print(AVL rt) {
     94     queue <AVL> q;
     95     q.push (rt);
     96     while (!q.empty()) {
     97         AVL tmp=q.front(); q.pop();
     98         if (flag) cout<<" ";
     99         else      flag=1;
    100         cout<<tmp->data;
    101         int num=0;
    102         if (tmp->left!=NULL) { q.push(tmp->left); num+=1; }
    103         if (tmp->right!=NULL) { q.push(tmp->right); num+=2; }
    104         if (num==2||num>tnum) isok=0;
    105         tnum=num;
    106     }
    107 }
    108 int main()
    109 {
    110     int n;
    111     cin >> n;
    112     AVL rt = NULL;
    113     for (int i = 1; i <= n; i++)
    114     {
    115         int x;
    116         cin >> x;
    117         rt = insert(x, rt);
    118     }
    119     isok=1;
    120     lev_print(rt); cout<<"
    ";
    121     if (isok) cout<<"YES
    ";
    122     else      cout<<"NO
    ";
    123     return 0;
    124 }
  • 相关阅读:
    Web用户控件
    ASP.Net状态管理读书笔记--思维导图
    网站教学 提纲总结到ajax结束后面还有
    ajax文本空输入显示用户信息
    Ajax 下拉列表联动显示
    用Ajax删除的做法
    Findora:引入保密性和可审计的区块链
    角逐云计算的“新黄金十年”,谁将胜出?
    区块链世界的中心应该是什么?
    边缘计算2.0时代存在哪些挑战?
  • 原文地址:https://www.cnblogs.com/xidian-mao/p/10993740.html
Copyright © 2011-2022 走看看