Okej, poradziłem sobie z tamtym problemem, teraz tak jakby nie miał dostępu do wierzchołka "Wierzcholek", czemu ?? Jak temu zaradzić.
#include <iostream>
#include <windows.h>
using namespace std;
template <class TD>
class Drzewo {
public:
class Wierzcholek {
public:
Wierzcholek(const TD& d)
: lewy(NULL)
, prawy(NULL)
, dane(d)
{
}
TD dane;
Wierzcholek* lewy, *prawy;
};
public:
Drzewo();
Drzewo(const Drzewo&);
bool Wstaw(const TD&);
void PreOrder() const;
void InOrder() const;
void PostOrder() const;
bool Usun(const TD&);
~Drzewo();
int licznik_liczba_w;
protected:
typedef Wierzcholek* WskWierzcholek;
WskWierzcholek korzen; // root
private:
bool WstawPomocnicza(WskWierzcholek&, const TD&);
void InOrderPom(WskWierzcholek) const;
void PreOrderPom(WskWierzcholek) const;
void PostOrderPom(WskWierzcholek) const;
void UsunDrzewo(WskWierzcholek&);
};
template <class TD>
class DrzewoD : public Drzewo<TD> {
public:
typedef class Drzewo<TD>::Wierzcholek* WskWierzcholek;
WskWierzcholek korzen; // root
public:
int LiczbaWierzcholkow();
};
template <class TD>
int DrzewoD<TD>::LiczbaWierzcholkow()
{
if (korzen == NULL)
return 0;
else
return 1 + LiczbaWierzcholkow(korzen->lewy) + LiczbaWierzcholkow(korzen->prawy);
}
template <class TD>
Drzewo<TD>::Drzewo()
{
korzen = NULL;
}
template <class TD>
bool Drzewo<TD>::Wstaw(const TD& d)
{
return WstawPomocnicza(korzen, d);
}
template <class TD>
bool Drzewo<TD>::WstawPomocnicza(WskWierzcholek& wsk, const TD& d)
{
if (wsk == NULL) {
WskWierzcholek pom;
try {
pom = new Wierzcholek(d);
wsk = pom;
return true;
}
catch (...) {
return false;
}
}
else {
// Drzewo nie jest puste
if (d < wsk->dane)
return WstawPomocnicza(wsk->lewy, d);
else if (wsk->dane < d)
return WstawPomocnicza(wsk->prawy, d);
else
return false;
}
// licznik_liczba_w++;
}
template <class TD>
void Drzewo<TD>::UsunDrzewo(WskWierzcholek& w)
{
if (w != NULL) {
UsunDrzewo(w->lewy);
UsunDrzewo(w->prawy);
delete w;
w = NULL;
}
}
template <class TD>
Drzewo<TD>::~Drzewo()
{
UsunDrzewo(korzen);
}
template <class TD>
void Drzewo<TD>::PreOrderPom(WskWierzcholek w) const
{
if (w != NULL) {
cout << w->dane << " ";
PreOrderPom(w->lewy);
PreOrderPom(w->prawy);
}
}
template <class TD>
void Drzewo<TD>::PreOrder() const
{
PreOrderPom(korzen);
}
template <class TD>
void Drzewo<TD>::PostOrderPom(WskWierzcholek w) const
{
if (w != NULL) {
PostOrderpom(w->lewy);
PostOrderPom(w->prawy);
cout << w->dana << " ";
}
}
template <class TD>
void Drzewo<TD>::PostOrder() const
{
PostOrderPom(korzen);
}
template <class TD>
void Drzewo<TD>::InOrderPom(WskWierzcholek w) const
{
if (w != NULL) {
InOrderpom(w->lewy);
cout << w->dana << " ";
InOrderPom(w->prawy);
}
}
template <class TD>
void Drzewo<TD>::InOrder() const
{
InOrderPom(korzen);
}
template <class TD>
bool Drzewo<TD>::Usun(const TD& d)
{
WskWierzcholek usuwany, zamienny, rodzic;
usuwany = korzen;
rodzic = NULL;
while (usuwany != NULL && usuwany->dane != d) {
rodzic = usuwany;
if (d < rodzic->dane)
usuwany = rodzic->lewy;
else
usuwany = rodzic->prawy;
}
if (usuwany == NULL)
return false;
// usuwamy
if (usuwany->lewy == NULL && usuwany->prawy == NULL) {
// usuwamy liscia
if (rodzic != NULL)
if (usuwany == rodzic->lewy)
rodzic->lewy = NULL;
else
rodzic->prawy = NULL;
else
korzen = NULL;
delete usuwany;
}
else if (usuwany->lewy == NULL || usuwany->prawy == NULL) {
if (usuwany->lewy == NULL)
zamienny = usuwany->prawy;
else
zamienny = usuwany->lewy;
// wszystkie dane z zamiennego przeładowujemy do usuwanego
*usuwany = *zamienny;
}
else
// są dwa poddrzewa
{
rodzic = usuwany;
zamienny = usuwany->lewy;
while (zamienny->prawy != NULL) {
rodzic = zamienny;
zamienny = zamienny->prawy;
}
usuwany->dane = zamienny->dane;
if (rodzic == usuwany)
rodzic->lewy = zamienny->lewy;
else
rodzic->prawy = zamienny->prawy;
}
delete zamienny;
return true;
}
int main()
{
Drzewo<int> drzewo;
drzewo.Wstaw(44);
drzewo.Wstaw(33);
drzewo.Wstaw(77);
drzewo.Wstaw(88);
drzewo.Wstaw(66);
drzewo.Wstaw(40);
drzewo.Wstaw(50);
drzewo.Wstaw(70);
drzewo.Wstaw(20);
drzewo.Wstaw(30);
drzewo.Wstaw(10);
drzewo.Wstaw(100);
DrzewoD<int> drzewko;
drzewko.Wstaw(33);
drzewko.Wstaw(77);
cout << drzewko.LiczbaWierzcholkow();
// drzewo2.Wstaw(88);
// cout << drzewo2.LiczbaWierzcholkow();
system("pause");
return 0;
}