susano990 Ответов: 0

Учитывая 2 BST я хочу удалить общие элементы из одного bst и распечатать его значения после удаления


у меня есть 2 BST(бинарные деревья поиска), они оба имеют общие элементы (если у 1 есть 4, например, у другого есть 4)(это объяснение), поэтому я хочу удалить этот элемент, например, из одного дерева, а не из обоих, так что вы можете мне помочь ? если вам нужно объяснение, скажите мне :)) так что plz помогите мне :)я пробовал этот код, но он не проходит случай 1 на hackerrank

Что я уже пробовал:

typedef struct node{
    int data;
    struct node *left, *right;
}*Btree;
int insert(Btree *b, int e){
    if (!*b){
        *b = (Btree)malloc(sizeof(struct node));
        if (!*b) return 0;
        (*b)->data = e;
        (*b)->right = NULL;
        (*b)->left = NULL;
        return 1;
    }
    else
        if (e<=(*b)->data)
            return insert(&((*b)->left), e);
        else
            return insert(&((*b)->right), e);
}
Btree min(Btree b){
    if (!b)return NULL;
    if (b->left)
        return min(b->left);
    return b;
}

Btree max(Btree b){
    if (!b)return NULL;
    if (b->right)
        return max(b->right);
    return b;
}
int deletebst(Btree *b,int e) {
    Btree temp;
    if(!*b) return 0;
    if(e<(*b)->data)
        return deletebst(&((*b)->left),e);
    else
        if(e>(*b)->data)
            return deletebst(&((*b)->right),e);
        else{
            if((*b)->left && (*b)->right){
                temp=min((*b)->right);
                (*b)->data=temp->data;
                return deletebst(&((*b)->right),temp->data);
            }
            else{
                temp=*b;
                if((*b)->left==NULL)
                    *b=(*b)->right;
                else
                    if((*b)->right==NULL)
                        *b=(*b)->left;
                free(temp);
            }
        }
    return 1;
}

void removebst(Btree *A, Btree B){
    if (!*A || !B)
        return;
    if ((*A)->data == B->data)
    {
        deletebst(A, B->data);
        removebst(A, B);
        removebst(A, B->right);
        removebst(A, B->left);
    }
    else if ((*A)->data > B->data)
    {
        removebst(&((*A)->left), B);
        removebst(A, B->right);

    }
    else if ((*A)->data < B->data){
        removebst(&((*A)->right), B);
        removebst(A, B->left);

    }
}
void inorder(Btree b)
{
    if (b)
    {
        inorder(b->left);
        printf("%d ", b->data);
        inorder(b->right);
    }
}void preorder(Btree b)
{
    if (b)
    {
        printf("%d ", b->data);
        preorder(b->left);
        preorder(b->right);
    }
}
void postorder(Btree b)
{
    if (b)
    {
        postorder(b->left);
        postorder(b->right);
        printf("%d ", b->data);
    }
}
int main() {

    /* Enter your code here. Read input from STDIN. Print output to STDOUT*/
    int size1, size2, tests, i, num;
    Bts A = NULL, B = NULL;
    scanf("%d", &tests);
    while (tests--)
    {
        A=NULL;
        B=NULL;
        scanf("%d", &size1);
        for (i = 0; i < size1; i++){
            scanf("%d", &num);
            insert(&A, num);
        }
        scanf("%d", &size2);
        for (i = 0; i < size2; i++){
            scanf("%d", &num);
            insert(&B, num);
        }
        removeB(&B, A);
        Inorder(B);
        printf("\n");
        Preorder(B);
        printf("\n");
        Postorder(B);
        printf("\n");
        printf("\n");
    }
    return 0;
}

Richard MacCutchan

Логически вам нужно искать одно дерево для каждого значения в другом дереве. Если значение найдено, то удалите его.

susano990

да, именно так я и сделал, но я не знаю, где я ошибся на hackerrank он прошел случай 0, но случай 1 Нет, я пытался и искал, где ошибка, которую я не мог найти

Patrice T

Можете ли вы дать ссылку на страницу hackerrank?

Patrice T

Похоже на настоящий конкурс, мы не можем получить доступ, если не зарегистрированы.

susano990

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

0 Ответов