二叉平衡树

性质

  • 对于AVL树的任意节点来说,左子树和右子树的高度之差的绝对值不超过1

二叉平衡树

//二叉平衡树
struct node
{
	int data, height;
	node* left;
	node* right;
};

生成一个新节点

//生成一个新节点
node* newNode(int data)
{
	node* root = new node;
	root->data = data;
	root->left = root->right = NULL;
	root->height = 1;
	return root;
}

获取root的高度

//获取root的高度
int getHeight(node* root)
{
	if (root == NULL)
		return 0;
	return root->height;
}

计算结点的平衡因子

//计算结点的平衡因子
int getBalance(node* root)
{
	if (root != NULL)
		return getHeight(root->left) - getHeight(root->right);
	return 0;
}

更新高度

void updateHeight(node* root)
{
	root->height = max(getHeight(root->left), getHeight(root->right)) + 1;
}

二叉平衡树的查找

//二叉平衡树的查找
void search(node* root,int v)
{
	if (root == NULL)
	{
		//查找失败
		printf("查找失败
");
		return;
	}
	if (root->data == v)
	{
		//找到了
		printf("查找成功
");
		return;
	}
	else if (root->data > v)
	{
		//左边找
		search(root->left, v);
	}
	else 
	{
		//右边找
		search(root->right, v);
	}
}

左旋

//左旋
void L(node* &root)
{
	//获得root的右孩子
	node* r = root->right;
	if (r != NULL)
	{
		//root的右孩子变为r的左孩子
		root->right = r->left;
		//r的左孩子变为root
		r->left = root;
		updateHeight(root);
		updateHeight(r);
		root = r;
	}
}

右旋

//右旋
void R(node*& root)
{
	//获得root的左孩子
	node* l = root->left;
	if (l != NULL)
	{
		//root的左孩子变为r的右孩子
		root->left = l->right;
		//r的左孩子变为root
		l->right = root;
		updateHeight(root);
		updateHeight(l);
		root =l;
	}
}

插入

//插入
void insert(node*& root, int v)
{
	if (root == NULL)
	{
		root = newNode(v);
		return;
	}
	if (v < root->data)
	{
		//插在左边
		insert(root->left, v);
		updateHeight(root);
		if (getBalance(root) == 2)
		{
			if (getBalance(root->left) == 1)//LL
			{
				//进行一次左旋
				L(root);
			}
			else if (getBalance(root->left) == -1)//LR
			{
				//进行一次左旋
				L(root->left);
				//进行一次右旋
				R(root);
			}
		}
	}
	else 
	{
		//插在右边
		insert(root->right, v);
		updateHeight(root);
		if (getBalance(root) == -2)
		{
			if (getBalance(root->right) == 1) //RL
			{
				//先右旋
				R(root->right);
				//再左旋
				L(root);
			}
			else if (getBalance(root->right) == -1)//RR
			{
				R(root);
			}
		}
	}
}

AVL的建立

//AVL的建立
node* Create(int data[],int n)
{
	node* root = NULL;
	for (int i = 0; i < n; i++)
	{
		insert(root, data[i]);
	}
	return root;
}
原文地址:https://www.cnblogs.com/code-fun/p/15228086.html