算法与数据结构10.1

★实验任务

欢迎来到暴走数据结构,我是洪尼玛。今天,我们来玩 AVL 树,怎么玩呢?很简单:给 你 n 个数字,你需要按顺序插入一棵 AVL 树中,然后给你下面 3 个操作

  • 操作 1:在 AVL 树中找到最大值,并输出它的值和所在节点的深度,然后删除该节点, 如果树为空树,则输出-1
  • 操作 2:在 AVL 树中找到最小值,并输出它的值和所在节点的深度,然后删除该节点, 如果树为空树,则输出-1
  • 操作 3:在 AVL 树中插入一个数 X 因为我不会 AVL 树,所以希望聪明的你们来帮我完成这个任务

★数据输入

输入第一个数为 n(n≤100000)表示数字的个数
接下来一行输入 n 个数,范围在 1 到 n 之间,每个数只出现一次
第三行输入一个数 m(m≤100000)表示需要进行操作的次数
接下来 m 行,每行输入第一个数为 op 表示执行操作的编号,若 op 等于 1 或 2,输出最大值 或最小值的大小和所在节点的深度;若 op 等于 3,接着输入一个数 X(X≤n),并将 X 插入 AVL 树中,数据保证当前 AVL 树中不存在 X 这个数

★数据输出

输入示例 输出示例
6
1 2 3 4 5 6
5
1
2
3 6
1
1
6 3
1 3
6 3
5 2

★提示

输出行末不能有空格

对于 50%的数据,1<=n<=100,1<=m<=100

对于 100%的数据,1<=n<=100000,1<=m<=100000

★思路

avl树操作

博客讲解

★Code

 
            #include<stdio.h>
#include<iostream>
using namespace std;
int deep[100005]={0}; 
int arr[100005] = {0};
int de = 1;
struct Node
{
	Node(int _data) :data(_data), hight(1), left(NULL), right(NULL) {}
	int hight;
	int data;
	Node *left;
	Node *right;
};
int max(int x, int y)
{
	return x > y ? x : y;
}
int get_hight(Node *p)
{
	if (p == NULL)
	{
		return 0;
	}
	else
		return p->hight;
}
Node* right_right_rotation(Node* k1)
{
	Node* k2;

	k2 = k1->right;
	k1->right = k2->left;
	k2->left = k1;

	k1->hight = max(get_hight(k1->left), get_hight(k1->right)) + 1;
	k2->hight = max(get_hight(k2->right), k1->hight) + 1;

	return k2;
}
Node* left_left_rotation(Node* k2)
{
	Node* k1;

	k1 = k2->left;
	k2->left = k1->right;
	k1->right = k2;

	k2->hight = max(get_hight(k2->left), get_hight(k2->right)) + 1;
	k1->hight = max(get_hight(k1->left), k2->hight) + 1;

	return k1;
}
Node* right_left_rotation(Node* k3)
{
	k3->left = right_right_rotation(k3->left);

	return left_left_rotation(k3);
}
Node* left_right_rotation(Node* k1)
{
	k1->right = left_left_rotation(k1->right);

	return right_right_rotation(k1);
}
Node* Insert(Node *p, int value)
{
	if (value < p->data)
	{
		if (p->left == NULL)
		{
			p->left = new Node(value);
			p->hight = max(get_hight(p->left), get_hight(p->right)) + 1;
			return p;
		}
		else
		{
			p->left = Insert(p->left, value);
			p->hight = max(get_hight(p->left), get_hight(p->right)) + 1;
		}

		

		if (get_hight(p->left) - get_hight(p->right) == 2)
		{  
			if (value < p->left->data)
				p = left_left_rotation(p);
			else
				p = right_left_rotation(p);
		}


	}

	if (value > p->data)
	{
		if (p->right == NULL)
		{
			p->right = new Node(value);
			p->hight = max(get_hight(p->left), get_hight(p->right)) + 1;
			return p;
		}
		else
		{
			p->right = Insert(p->right, value);
			p->hight = max(get_hight(p->left), get_hight(p->right)) + 1;
		}

		

		if (get_hight(p->right) - get_hight(p->left) == 2)
		{
			if (value > p->right->data)
				p = right_right_rotation(p);
			else
				p = left_right_rotation(p);

		}

	}
	return p;
}
void search(Node* p)
{
	if(p->left==NULL&&p->right==NULL)
	{
		deep[p->data] = de;
		de--;
		return ;
	}
	if(p->left!=NULL)
	{
		deep[p->data] = de;
		de++;
		search(p->left);
	}
	if(p->right!=NULL)
	{
		deep[p->data] = de;
		de++;
		search(p->right);
	}
	de--;
}
int main()
{
	int n;
	int temp;
	int i;
	scanf("%d",&n);
	scanf("%d",&i);
	arr[1] = i;
	Node * tree = new Node(i);
	for ( i = 2; i <= n; i++)
	{
		scanf("%d",&temp);
		arr[i] = temp;
		tree = Insert(tree, temp);
	}
	search(tree);
	for(i=1;i<=n;i++)
	{
		printf("%d",deep[arr[i]]);
		if(i<n)
		printf(" ");
	}
	return 0;
}
        
原文地址:https://www.cnblogs.com/031602523liu/p/7901133.html