Problem z drzewkiem jest taki, że ma duże problemy z kasowaniem elementów. Na przyklad, wprowadzenie do drzewka po kolei 10, 20, 30, 40, 50 (sami prawi synowie będą w drzewie) a potem kasowanie elementów od końca, spowoduje, że jak dam element o kluczu 20 do skasowania, to nie skasuje, ale jego ponowne skasowanie wywola blad zwiazany z podwójnym delete na pustym wskazniku. Takich przypadkow niedzialania jest wiecej. A czasami, to w ogóle zechce wykasować coś innego niż ja chcę! Ogolnie, z strony algorytmu wyglada to poprawnie, wiec problem pewnie lezy z implementacją.

Algorytm, ze tak powiem, jest taki, ze jak mamy element do skasowania, ktory nie jest korzeniem (kasowanie korzenia z dziwnych powodow wyglada na to, ze dziala, jak dawalem roznego rodzaju przypadki), to zliczy ile ma dzieci. Jak 0, to ustali, z której strony, prawej czy lewej, jest po stronie rodzica, ustawi ten wskaznik na NULL, rozlaczy sie od niego po czym go skasuje. Jak 1 dziecko, to sprawdzi, po ktorej jest stronie, i u rodzica polaczy galaz z tym jedynym dzieckiem, sam przerwie polaczenia, po czym zostanie skasowany. Jak 2 dzieci, to znajdzie najmiejszy element u prawej odnogi, na tym do skasowania klucz = klucz minimalny, po czym zostanie skasowany ten minimalny.

binaryTreeNode to klasa wezla, BinaryTreeController to klasa obslugujaca drzewo.

Tyle teorii, praktyka jest taka, ze to nie dziala.

Kod ktory sluzy do kasowania ->

void BinaryTreeController::deleteValue(int valueToDelete){
	
	binaryTreeNode* nodeToDelete = NULL;
	root->find(valueToDelete,&nodeToDelete);
	
	if(nodeToDelete == NULL){
		return;
	}
	//WYGLADA NA TO ZE DZIALA
	
	if(nodeToDelete == root){
		int numOfChildren = root->countChildren();
		if(numOfChildren == 0){
			delete root;
			root = NULL;
			return;
		}
		else if(numOfChildren == 1){
			root = root->returnOnlyChild();
			nodeToDelete->clearConnections();
			delete nodeToDelete;
			return;
		}
		else if(numOfChildren == 2){
			binaryTreeNode* minimalNode = root->right->min();
			//root->right->min(&minimalNode);
			if(minimalNode != NULL){
				root->key = minimalNode->key;
				int numOfMinimalNodeChildren = minimalNode->countChildren();
				if(numOfMinimalNodeChildren == 0){
					if(minimalNode == minimalNode->parent->left){
						minimalNode->parent->left = NULL;
					}
					else {
						minimalNode->parent->right = NULL;
					}
					minimalNode->clearConnections();
					delete minimalNode;
					return;
				}
				else{
					if(minimalNode == minimalNode->parent->left){
						minimalNode->parent->left = minimalNode->returnOnlyChild();
					}
					else {
						minimalNode->parent->right = minimalNode->returnOnlyChild();
					}
					minimalNode->clearConnections();
					delete minimalNode;
					return;
				}
			}
		}
	}
	//MOZE NIE DZIALAC
	else if(nodeToDelete != root){
		int numOfChildren = nodeToDelete->countChildren();
		if(numOfChildren == 0){
			if(nodeToDelete == nodeToDelete->parent->left){
				nodeToDelete->parent->left = NULL;
			}
			else{
				nodeToDelete->parent->right = NULL;
			}
			nodeToDelete->clearConnections();
			delete nodeToDelete;
			return;
		}
		else if(numOfChildren == 1){
			if(nodeToDelete == nodeToDelete->parent->left){
				nodeToDelete->parent->left = nodeToDelete->returnOnlyChild();
			}
			else{
				nodeToDelete->parent->right = nodeToDelete->returnOnlyChild();
			}
			nodeToDelete->clearConnections();
			delete nodeToDelete;
			return;
		}
		else if(numOfChildren == 2){
			binaryTreeNode* minimalNode = nodeToDelete->right->min();
			if(minimalNode != NULL){
				nodeToDelete->key = minimalNode->key;
				int numOfMinimalNodeChildren = minimalNode->countChildren();
				if(numOfMinimalNodeChildren == 0){
					if(minimalNode == minimalNode->parent->left){
						minimalNode->parent->left = NULL;
					}
					else {
						minimalNode->parent->right = NULL;
					}
					minimalNode->clearConnections();
					delete minimalNode;
					return;
				}
				else if(numOfMinimalNodeChildren == 1){
					if(minimalNode == minimalNode->parent->left){
						minimalNode->parent->left = minimalNode->returnOnlyChild();
					}
					else {
						minimalNode->parent->right = minimalNode->returnOnlyChild();
					}
					minimalNode->clearConnections();
					delete minimalNode;
					return;
				}
				else{
					minimalNode->clearConnections();
					delete minimalNode;
				}
			}
		}
	}

}

Link do pelnego programu jest tutaj - http://pastebin.com/JNjb9WPV, obsluga programu jest taka, ze najpierw wypisujemy ile komend zostanie podanych, potem tak - a liczba wstawi liczbe, d liczba znajdzie i skasuje liczbe, w wypisze wszystkie elementy tablicy.