AVL模板

建AVL树的步骤

  • 建立带高度的节点:1、2
  • 计算、更新高度:3、4
  • 左旋、右旋:6
  • 插入、创建:7、8
  1. struct node
  2. node* newNode(int v)
  3. int getHeight(node* root)
    int getBalanceFactor(node* root)
  4. void updateHeight(node* root)
  5. node* search(node* root,int x)
  6. void L(node* &root)
    void R(node* &root)
  7. void insert(node* &root,int v)
  8. 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值