Mam taki oto kod:
#include <iostream>
#include <string>
using namespace std;
template<class T>
class TreeElem{
private:
T elem;
public:
TreeElem<T>* left;
TreeElem<T>* right;
T getElem(){return elem;}
TreeElem(T elem){
this->elem=elem;
this->left=NULL;
this->right=NULL;
}
~TreeElem(){}
};
/**klasa reprezentujaca drzewo*/
template<class T>
class Tree{
public:
/**korzen drzewa*/
TreeElem<T>* root;
/**glowny konstruktor klasy*/
Tree(){root=NULL;}
/**funkcja przeszukujaca w drzewo w poszukiwaniu elementu elem
* @param elem element, ktorego poszukujemy
* @return true, jesli szukany element jest w drzewie
* @return false, jesli szukanego elementu nie ma w drzewie
*/
bool search(T elem){
TreeElem<T>* temp=root;
while(true){
if(temp==NULL){return false;}
if(elem==temp->getElem()){return true;}
if(elem<temp->getElem()){temp=temp->left;}
else{temp=temp->right;}
}
}
/**funkcja wstawiajaca element elem do drzewa(jesli element ten jest juz w drzewie, to nic nie robi)
* @param elem element do wstawienia
*/
void insert(T elem){
root=insert(elem, root);
}
/**funkcja konwertujaca drzewo na String
* @return drzewo wypisane w porzadku in order, kolejne elementy oddzielone tabulatorami
*/
void draw(){
draw(root);
}//linijka 54
/**funkcja usuwajaca element elem z drzewa(jesli elementu nie ma w drzewie, to nic nie robi)
* @param elem element do usuniecia
*/
void delete(T elem){//linijka 59
TreeElem<T>* father=NULL;
TreeElem<T>* temp=root;
boolean side=true; //true, gdy temp jest lewym synem; false, gdy temp jest prawym synem
if(root==NULL){return;}
if(root->getElem()==elem){
if(root->right==null){
temp=root->left;
delete(root);
root=temp;
}else{
temp=root->right;
if(temp.left==NULL){
temp.left=root->left;
delete(root);
root=temp;
}else{
while(temp->left!=null){
father=temp;
temp=temp->left;
}
father->left=temp->right;
temp->left=root->left;
temp->right=root->right;
delete(root);
root=temp;
}
}
return;
}
while(true){
if(temp==NULL){return;}
if(elem==temp->getElem()){
if(temp->right==NULL){
if(side){
father->left=temp->left;
delete(temp);
}
else{
father.right=temp.left;
delete(temp);
}
}
else{
TreeElem<T>* temp2=temp->right;
TreeElem<T>* father2=temp;
while(temp2->left!=NULL){
father2=temp2;
temp2=temp2->left;
}
father2->left=temp2->right;
temp2->left=temp->left;
temp2->right=temp->right;
delete(temp);
if(side){father->left=temp2;}
else{father->right=temp2;}
}
}
father=temp;
if(elem<temp->getElem()){temp=temp->left; side=true;}
else{temp=temp->right; side=false;}
}
}
private:
TreeElem<T>* insert(T elem, TreeElem<T>* root){
if(root==NULL){return new TreeElem<T>(elem);}
else{
if(elem<root->getElem()){root->left=insert(elem, root->left);}
else if(elem>root->getElem()){root->right=insert(elem, root->right);}
return root;
}
}
void draw(TreeElem<T>* root){
if(root!=NULL)
{
draw((*root).left);
cout<<(*root).getElem();
cout<<"\t";
draw((*root).right);
}
}
};
int main(int argc, char** argv){
Tree<string> tree;
tree.insert("kot");
tree.insert("ma");
tree.insert("ala");
tree.insert("gornik");
tree.insert("spada");
tree.insert("zabrze");
tree.draw();
cout<<endl;
return 0;
}//linijka 153
I dostaję następujące błędy przy kompilacji:
Jak znam życie, to pewnie jakiś głupi błąd wynikły z niedopatrzenia, ale sprawdzałem wszystkie nawiasy i moim zdaniem są w porządku. Najciekawszy jest fakt, że po okomentowaniu funkcji delete nie ma żadnych błędów kompilacji