Проблемы с трепом (без неявных ключей)

Извините за мой плохой английский.

Мне нужно удалить ключ в моем трепе, но моя реализация не позволит мне это сделать. Более ясно, если мой треп выглядит так:

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 

0 ответов

Другие вопросы по тегам