zoukankan      html  css  js  c++  java
  • PAT甲级1123 Is It a Complete AVL Tree【AVL树】

    题目https://pintia.cn/problem-sets/994805342720868352/problems/994805351302414336

    题意:

    给定n个树,依次插入一棵AVL树,按照层序遍历输出,最后判断这棵AVL树是不是完全二叉树。

    思路:

    这道题过段时间还要再来手搓一发。AVL模板要记住。

    判断是不是完全二叉树的话只用看,如果有一个节点儿子是空,而他之后又出现了至少有一个儿子的节点的话,就不是完全二叉树。【蛮巧妙的】

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<map>
      4 #include<set>
      5 #include<iostream>
      6 #include<cstring>
      7 #include<algorithm>
      8 #include<vector>
      9 #include<cmath> 
     10 #include<stack>
     11 #include<queue>
     12 
     13 #define inf 0x7fffffff
     14 using namespace std;
     15 typedef long long LL;
     16 typedef pair<string, string> pr;
     17 
     18 int n;
     19 const int maxn = 25;
     20 vector<int>level[maxn];
     21 typedef struct AvlNode{
     22     int val;
     23     AvlNode *left;
     24     AvlNode *right;
     25     int height;
     26 }*AvlTree, AvlNode;
     27 
     28 int Max(AvlTree a, AvlTree b)
     29 {    
     30     int x = 0, y = 0;
     31     if(a)x = a->height;
     32     if(b)y = b->height;
     33     if(x > y)return x;
     34     else return y;
     35 }
     36 
     37 AvlTree singleRotateWithRight(AvlTree T)
     38 {
     39     AvlTree L = T->left;
     40     T->left = L->right;
     41     L->right = T;
     42     T->height = Max(T->left, T->right) + 1;
     43     L->height = Max(L->left, L->right) + 1;
     44     return L;
     45 } 
     46 
     47 AvlTree singleRotateWithLeft(AvlTree T)
     48 {
     49     AvlTree R = T->right;
     50     T->right = R->left;
     51     R->left = T;
     52     T->height = Max(T->left, T->right) + 1;
     53     R->height = Max(R->left, R->right) + 1;
     54     return R;
     55 }
     56 
     57 AvlTree doubleRotateWithLeft(AvlTree T)
     58 {
     59     T->left = singleRotateWithLeft(T->left);
     60     return singleRotateWithRight(T);
     61 }
     62 
     63 AvlTree doubleRotateWithRight(AvlTree T)
     64 {
     65     T->right = singleRotateWithRight(T->right);
     66     return singleRotateWithLeft(T);
     67 }
     68 
     69 AvlTree Insert(AvlTree T, int val)
     70 {
     71     if(T == NULL){
     72         T = (AvlNode *)malloc(sizeof(struct AvlNode));
     73         if(T){
     74             T->val = val;
     75             T->left = NULL;
     76             T->right = NULL;
     77             T->height = 0;
     78         }
     79     }
     80     else if(val < T->val){
     81         T->left = Insert(T->left, val);
     82         int l = 0, r = 0;
     83         if(T->left){
     84             l = T->left->height;
     85         }
     86         if(T->right){
     87             r = T->right->height;
     88         }
     89         if(l - r == 2){
     90             if(val < T->left->val){
     91                 T = singleRotateWithRight(T);
     92             }
     93             else{
     94                 T = doubleRotateWithLeft(T);    
     95             } 
     96         }
     97     }
     98     else if(val > T->val){
     99         T->right = Insert(T->right, val);
    100         int l = 0, r = 0;
    101         if(T->left)l = T->left->height;
    102         if(T->right)r = T->right->height;
    103         if(r - l == 2){
    104             if(val > T->right->val){
    105                 T = singleRotateWithLeft(T);
    106             }
    107             else{
    108                 T = doubleRotateWithRight(T);
    109             }
    110         }
    111     }
    112     T->height = Max(T->left, T->right) + 1;
    113     return T;
    114 }
    115 
    116 bool after = false, iscomplete = true;
    117 bool first = false;
    118 void levelOrder(AvlTree T)
    119 {
    120     queue<AvlTree>que;
    121     que.push(T);
    122     while(!que.empty()){
    123         AvlTree now = que.front();que.pop();
    124         if(first)printf(" ");
    125         else first = true;
    126         printf("%d", now->val);
    127         level[now->height].push_back(now->val);
    128         if(now->left){
    129             if(after)iscomplete = false;
    130             que.push(now->left);
    131         }
    132         else{
    133             after = 1;
    134         }
    135         if(now->right){
    136             if(after)iscomplete = false;
    137             que.push(now->right);
    138         }
    139         else{
    140             after = 1;
    141         }
    142     }
    143 }
    144 
    145 int main()
    146 {
    147     scanf("%d", &n);
    148     AvlTree Tree = NULL;
    149     for(int i = 0; i < n; i++){
    150         int x;
    151         scanf("%d", &x);
    152         Tree = Insert(Tree, x);
    153     }
    154     levelOrder(Tree);
    155     printf("
    ");
    156     if(iscomplete)printf("YES
    ");
    157     else printf("NO
    ");
    158     return 0;
    159 }
  • 相关阅读:
    转 mysql front安装与使用教程 mysql 工具
    转 rac中并行 PARALLEL 的设置
    转 oracheck
    OCR 维护 crsd.log
    转 Comparison of Red Hat and Oracle Linux kernel versions and release strings
    转 ORACLE 查看RMAN的备份信息总结
    转载 Some indexes or index [sub]partitions of table VAS.TAB_PUB_CALLLOG have been marked unusable
    ORACLE CBC LATCH 检查
    转 PyCharm 进行调试 以及怎么熟悉一个已经成熟的项目的代码和断点 以及 jetBrains pycharm快捷键
    ecplise 正则替换技巧
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10684548.html
Copyright © 2011-2022 走看看