建AVL树的步骤
- 建立带高度的节点:1、2
- 计算、更新高度:3、4
- 左旋、右旋:6
- 插入、创建:7、8
- struct node
- node* newNode(int v)
- int getHeight(node* root)
int getBalanceFactor(node* root) - void updateHeight(node* root)
- node* search(node* root,int x)
- void L(node* &root)
void R(node* &root) - void insert(node* &root,int v)
- node* create(int data[],int n)
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
int v,height;
node *lchild,*rchild;
};
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;
}
int getBalanceFactor(node* root){
return getHeight(root -> lchild) - getHeight(root -> rchild);
}
void updateHeight(node* root){
root -> height = max(getHeight(root -> lchild),getHeight(root -> rchild)) + 1;
}
node* search(node* root,int x){
if(!root)
return;
if(x == root -> v){
return root;
}else if(x > root -> v)
search(root -> lchild,x);
else
search(root -> rchild,x);
}
void L(node* &root){
node* temp = root -> rchild;
root -> rchild = temp -> lchild;
temp -> lchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}
void R(node* &root){
node* temp = root -> lchild;
root -> lchild = temp -> rchild;
temp -> lchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}
void insert(node* &root,int v){
if(!root){
root = newNode(v);
return;
}
if(v < root -> v){
insert(root -> lchild,v);
updateHeight(root);
if(getBalanceFactor(root) == 2){
if(getBalanceFactor(root -> lchild) == 1)
R(root);
if(getBalanceFactor(root -> lchild) == -1){
L(root -> lchild);
R(root);
}
}
if(getBalanceFactor(root) == -2){
if(getBalanceFactor(root -> rchild) == -1)
L(root);
if(getBalanceFactor(root -> rchild) == 1){
R(root -> rchild);
L(root);
}
}
}
}
node* create(int data[],int n){
node* root = NULL;
for(int i = 0;i < n;i++){
insert(root,data[i]);
}
return root;
}