题目描述
对二叉平衡树进行四种操作:
1 D K 表示插入一个新数据,数据为D用于输出,关键值为K用于排序;
2 输出当前树中最大关键值所带的数据,并删除该数据,如果没有这个关键值,则输出0;
3 输出当前树中最小关键值所带的数据,并删除该数据,如果没有这个关键值,则输出0;
4 K 输出关键值为 K 的数据,并删除该数据,如果没有这个关键值,则输出0。
要求必须实现平衡树,不可以使用各类库函数
AVL代码模板参考:
#include<stdio.h>
const int maxn = 1e5 + 10;
struct Node
{
int key; // 关键值
int data; // 携带的数据
int left; // 左子树地址(数组下标)
int right; // 右子树地址(数组下标)
int height; // 当前结点为根的子树高度
void Init(){data = key = left = right = height = -1;}
void Init(int k_, int d_=0){Init(); key = k_; data = d_;}
Node(){Init();}
Node(int k_, int d_=0){Init(k_, d_);}
};
Node tr[maxn];
int root, tp; // root标记根节点位置,tp全局结点分配下标
inline int UpdateHeight(int now)
{
// 更新 tr[now] 结点的子树高度,即tr[now].height的值
}
inline int HeightDiff(int now)
{
// 计算 tr[now] 结点的平衡因子
}
int LL(int an)
{
}
int RR(int an)
{
}
int LR(int an)
{
}
int RL(int an)
{
}
void Insert(int &now, int key, int data=0)
{
if(now == -1)
{
// 传入指针为空,新建结点保存数据
now = ++ tp;
tr[now].Init(key, data);
}
// 判断插入哪个子树,插入数据,判断平衡因子,做正确旋转,更新高度
}
void Delete(int &now, int key)
{
if(now == -1) return;
else if(key < tr[now].key) Delete(tr[now].left, key);
else if(key > tr[now].key) Delete(tr[now].right, key);
else
{
// 删除当前结点
}
// 处理树平衡
}
int main()
{
int n, op, key, data;
while(scanf("%d", &n) != EOF)
{
for(root = tp = -1; n --; ) // 初始化根结点和“内存指针”
{
scanf("%d", &op);
if(op == 1)
{
}
else if(op == 2)
{
}
else if(op == 3)
{
}
else
{
}
}
return 0;
}
输入
每组数据第一行n表示有n个操作
接下来n行操作内容
输出
按操作规则输出对应内容
测试样例:
8
2
1 20 14
1 30 3
2
1 10 99
3
2
2
输出:
0
20
30
10
0