Проблемы с трепом (без неявных ключей)
Извините за мой плохой английский.
Мне нужно удалить ключ в моем трепе, но моя реализация не позволит мне это сделать. Более ясно, если мой треп выглядит так:
2 3 5 5 5 8 10 12 12.
Я хочу стереть ключ '5', чтобы он выглядел так:
2 3 5 5 8 10 12 12 // пропал только один '5'
Но мой код будет работать так:
2 3 8 10 12 12. // Все "5" исчезли.
Это моя проблема. Похоже, мой код не может удалить только один узел в Treap. Можете ли вы помочь мне об этом?
Вот мой код:
#include <iostream>
#include <math.h>
using namespace std;
struct treapNode{
int key,prior;
struct treapNode *l,*r;
};
const int limRand = 1e7;
typedef struct treapNode * tNode;
tNode root = nullptr;
tNode getNode(int key){
tNode newNode = new treapNode;
newNode -> key = key;
newNode -> prior = rand()%limRand;
newNode -> l = newNode -> r = nullptr;
return newNode;
}
void splitTree(tNode curNode,int key,tNode &left,tNode &right){
if(!curNode){
left = right = nullptr;
return;
}
if(curNode -> key < key){
splitTree(curNode -> r,key,curNode -> r,right);
left = curNode;
}
else{
splitTree(curNode -> l,key,left,curNode -> l);
right = curNode;
}
}
void mergeTree(tNode &curNode,tNode left,tNode right){
if(!left || !right){
curNode = left ? left : right;
return;
}
if(left -> prior > right -> prior){
mergeTree(left -> r,left -> r,right);
curNode = left;
}
else{
mergeTree(right -> l,left,right -> l);
curNode = right;
}
}
void outputTree(tNode curNode){
if(!curNode) return;
outputTree(curNode -> l);
cout<<curNode -> key<<" ";
outputTree(curNode -> r);
}
void insertNode(int key){
tNode t1,t2,t3;
splitTree(root,key,t1,t2);
tNode newNode = getNode(key);
/* cout<<"This is t1 tree:\n";
outputTree(t1);
cout<<"\nEnd output here.\n";*/
mergeTree(t3,t1,newNode);
mergeTree(root,t3,t2);
}
void eraseNode(int key){
tNode t1,t2,t3,t4,t5;
splitTree(root,key,t1,t2);
splitTree(t2,key+1,t3,t4);
/* cout<<"This is t3 tree:\n";
outputTree(t3);
cout<<"\nEnd output here.\n";*/
mergeTree(root,t1,t4);
}
int main(){
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;++i){
char type; int num;
cin>>type>>num; // a means add, e means erase
if(type == 'a') insertNode(num);
else eraseNode(num);
outputTree(root);
cout<<"\n";
}
outputTree(root);
}
Входные данные:
6
a 5
a 7
a 5
e 5
a 3
e 7
Выход:
5
5 7
5 5 7
7
3 7
3
3