PAT:AVL树模板

Posted 花落,莫相离

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT:AVL树模板相关的知识,希望对你有一定的参考价值。

//定义结点
struct node{
    int data, height;
    node *left, *right;
};

//创建新结点
node* newNode(int x){
    node* root = new node;
    root->data = x;
    root->height = 1;   //此处要初始化为1
    root->left = NULL;
    root->right = NULL;
    return root;
}

//获取结点高度(主要是省略了对空结点的特判,便于更新结点高度)
int getHeight(node* root){
    if(root == NULL)    return 0;
    else    return root->height;
}

//获取结点平衡因子
int getBalanceFactor(node* root){
    return getHeight(root->left) - getHeight(root->right);
}

//更新结点的高度
void updateHeight(node* root){//此处是修改结点内部的值,因此不用引用,目前为止只有下面的两个旋转操作需要使用引用,因为涉及到改变整个树结点之间的结构关系
    root->height = max(root->left->height, root->right->height) + 1;
}

//左旋
void L(node* &root){
    node* temp = root->right;
    root->right = temp->left;   //下面这两句话顺序不能搞反,不清楚时可以画一个图
    temp->left = root;
    updateHeight(root); //下面这两句更新高度不能忘
    updateHeight(temp);
    root = temp;
}

//右旋
void R(node* &root){
    node* temp = root->left;
    root->left = temp->right;
    temp->right = root;
    updateHeight(root);
    updateHeight(temp);
    root = temp;
}

//插入结点
void insert(node* &root, int x){//先指针符号再引用符号
    if(root == NULL){
        root = newNode(x);
        return;
    }
    if(x > root->data){
        insert(root->right, x);
        updateHeight(root);
        if(getBalanceFactor(root) == -2){
            if(getBalanceFactor(root->right) == -1){
                L(root);
            }else{
                R(root->right);
                L(root);
            }
        }
    }else{
        insert(root->left, x);
        updateHeight(root);
        if(getBalanceFactor(root) == 2){
            if(getBalanceFactor(root->right) == 1){
                R(root);
            }else{
                L(root->left);
                R(root);
            }
        }
    }
}

//建树
node* create(int data[], int n){
    node* root = NULL;
    for(int i = 0; i < n; i++){
        insert(root, data[i]);
    }
    return root;
}

以上是关于PAT:AVL树模板的主要内容,如果未能解决你的问题,请参考以下文章

PAT.1066 Root of AVL Tree(平衡树模板题)

PAT 1066 Root of AVL Tree[AVL树][难]

PAT甲级题分类汇编——树

AVL树模板

PTA Root of AVL Tree (AVL树模板+四种旋转+指针)

PAT A1066 Root of AVL Tree [平衡二叉树]