Учитывая 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?
susano990
вот и вся связь:
https://www.hackerrank.com/contests/i2206-lab8/challenges/binary-search-trees-variant[^]
Patrice T
Похоже на настоящий конкурс, мы не можем получить доступ, если не зарегистрированы.
susano990
да, я забыл сказать вам, что это для студентов университета. я не знаю что делать код кажется правильным я ставлю некоторые цифры и ответ правильный но может быть я делаю не все случаи