zoukankan      html  css  js  c++  java
  • 04-树5 Root of AVL Tree (25 分)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

    Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive integer N (20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print the root of the resulting AVL tree in one line.

    Sample Input 1:

    5
    88 70 61 96 120
    

    Sample Output 1:

    70
    

    Sample Input 2:

    7
    88 70 61 96 120 90 65
    

    Sample Output 2:

    88
    
     
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct node{
        int v,height;
        node* lchild,*rchild;
    }*root;
    
    node* newNode(int v){
        node* Node = new node;
        Node->v = v;
        Node->height = 1;
        Node->lchild = Node->rchild = NULL;
        return Node;
    }
    
    int getHeight(node* root){
        if(root == NULL) return 0;
        return root->height;
    }
    
    void updateHeight(node* root){
         root->height = max(getHeight(root->lchild),getHeight(root->rchild)) + 1;
    }
    
    int getBalanceFactor(node* root){
        return getHeight(root->lchild) - getHeight(root->rchild);
    }
    
    void R(node* &root){
        node* temp = root->lchild;
        root->lchild = temp->rchild;
        temp->rchild = root;
        updateHeight(root);
        updateHeight(temp);
        root = temp; 
    }
    
    void L(node* &root){
        node* temp = root->rchild;
        root->rchild = temp->lchild;
        temp->lchild = root;
        updateHeight(root);
        updateHeight(temp);
        root = temp;
    }
    
    void insert(node* &root,int v){
        if(root == NULL){
            root = newNode(v);
            return;
        }
        if(root->v > v){
            insert(root->lchild,v);
            updateHeight(root);
            if(getBalanceFactor(root) == 2){
                if(getBalanceFactor(root->lchild) == 1){
                    R(root);
                }else if(getBalanceFactor(root->lchild) == -1){
                    L(root->lchild);
                    R(root);
                }
            }
        }else{
                insert(root->rchild,v);
                updateHeight(root);
                if(getBalanceFactor(root) == -2){
                   if(getBalanceFactor(root->rchild) == -1){
                    L(root);
                   }else if(getBalanceFactor(root->rchild) == 1){
                    R(root->rchild);
                    L(root);
                   }
               } 
            }    
    }
    
    int main(){
        int n,v;
        scanf("%d",&n);
        for(int i = 0; i < n; i++){
            scanf("%d",&v);
            insert(root,v);
        }
        printf("%d",root->v);
        return 0;
    }
  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/10409343.html
Copyright © 2011-2022 走看看