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树][难]