Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void deleteNode(node* root, int tempkey)
- {
- node* nodeRemove = findNode(tempkey, root);
- node* temp;
- if (nodeRemove != NULL) // sprawdzam czy usuwany element istnieje
- {
- if (nodeRemove->left == NULL && nodeRemove->right == NULL) // sprawdzam czy usuwany element jest liściem
- {
- if (nodeRemove->key < nodeRemove->up->key) // jeśli element jest liściem z lewej strony
- {
- nodeRemove->up->left = NULL; // usuwam element
- nodeRemove = NULL;
- }
- else
- {
- nodeRemove->up->right = NULL; // w przeciwnym wypadku (element jest liściem z prawej strony) usuwam element
- nodeRemove = NULL;
- }
- }
- else if (nodeRemove->left == NULL || nodeRemove->right == NULL) // sprawdzam czy usuwany element ma dziecko z lewej bądź prawej strony
- {
- if (nodeRemove->left != NULL) // jeśli element ma dziecko z lewej strony
- {
- temp = nodeRemove->left; // ustawiam temp na dziecko
- }
- else
- {
- temp = nodeRemove->right; // w przeciwnym wypadku (element ma dziecko z prawej strony) ustawiam temp na dziecko
- }
- nodeRemove->key = temp->key; // ustawiam usuwany element na jego dziecko
- nodeRemove->left = temp->left;
- nodeRemove->right = temp->right;
- }
- else
- { // ostatni warunek, czyli gdy element posiada dzieci po lewej i po prawej stronie
- A:
- int t; // daję wybór, który element (skrajnie prawy bądź skrajnie lewy) ma zastąpić usuwany element
- system("cls");
- cout << "Element ktory chcesz usunac ma oboje dzieci. Wybierz ktory element wstawiasz na miejsce usuwanego: " << endl;
- cout << "1. Skrajnie prawy z lewego poddrzewa" << endl;
- cout << "2. Skrajnie lewy z prawego poddrzewa" << endl << endl;
- cin >> t;
- switch (t)
- {
- case 1: // przypadek, gdy element skrajnie prawy z lewego poddrzewa ma zastąpić usuwany element
- {
- temp = nodeRemove; // ustawiam temp na usuwany element
- temp = temp->left; // przechodzę do lewego poddrzewa
- while (temp->right != NULL) // dopóki istnieje skrajny element po prawej stronie
- {
- temp = temp->right; // ustawiam tempa na skrajny element
- }
- nodeRemove->key = temp->key; // zmieniam wartości usuwanego elementu na skrajnie prawy element
- if (temp->right != NULL) // sprawdzam czy skrajnie prawy element ma dziecko z prawej strony
- {
- temp->key = temp->right->key; // jeśli tak, to ustawiam wartość jego dziecka na niego
- temp->right = NULL;
- }
- else if (temp->left != NULL) // sprawdzam czy skrajnie prawy element ma dziecko z lewej strony
- {
- temp->key = temp->right->key; // jeśli tak, to ustawiam wartość jego dziecka na niego
- temp->left = NULL;
- }
- else
- {
- temp->up->right = NULL; // jeśli skrajnie prawy element nie posiada dzieci, to go usuwam
- temp = NULL;
- }
- break;
- }
- case 2: // analogicznie jak case 1 tylko zastępowanym elementem jest element skrajnie lewy z prawego poddrzewa
- {
- temp = nodeRemove;
- temp = temp->right;
- while (temp->left != NULL)
- {
- temp = temp->left;
- }
- nodeRemove->key = temp->key;
- if (temp->right != NULL)
- {
- temp->key = temp->right->key;
- temp->right = NULL;
- }
- else if (temp->left != NULL)
- {
- temp->key = temp->right->key;
- temp->left = NULL;
- }
- else
- {
- temp->up->left = NULL;
- temp = NULL;
- }
- break;
- }
- default:
- {
- system("cls"); goto A;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement