Nieuporządkowane drzewo binarne

0

Witam!
Muszę zrobić funkcję znajdującą maxa w nieuporządkowanym drzewie binarnym. Próbowałem zrobić to rekurencyjnie (swoją drogą nie umiem przeszukiwać drzewa inaczej niż rekurencyjnie) lecz podczas 'zamykania' rekurencji zmienna przechowująca maxa się zmienia z powodu jej lokalnego wykorzystania.

Struktura drzewa:

typedef struct element
{
	int key;
	struct element *left, *right;
};

typedef struct element elDrzewa;
typedef elDrzewa *drzewo;
int searchMax(drzewo d, int max)
{
	if(d != NULL)
	{
		searchMax(d->right, max);
		if(max < d->key) max=d->key;
		else max=max;
		printf("klucz: %d -> max: %d\n",d->key,max);
		searchMax(d->left, max);
		if(max < d->key) max=d->key;
		return max;
	}
}

Ta funkcja zawsze zwraca zawsze korzeń. Ma ktoś jakiś pomysł jak ją przerobić?

0

Tka na szybko to nie ma prawa sie wykonac linijka dalej niz rekurencyjne wywolanie funkcji + nie zwracasz wartosci zadnej w przypadku d==0. Co do modyfikacji max to utworz sobie zmienna pomocnicza i operuj na niej.

Edit: Po ciut glebszym spojrzeniu wydaje mi sie, ze nie masz pojecia co robisz.

0

Ogólnie na temat rekurencji mam blade pojęcie. Jeśli do tego dochodzi operowanie na drzewach to wychodzi z tego masakra. Byłbym niezmiernie wdzięczny za jakieś wyjaśnienie.

0

Wez kartke i dlugopis (ew. rysuj w paincie).
Namaluj sobie to drzewko.
Zastanow sie co tak naprawde chcesz zrobic.
Pomysl w jaki sposob to zrobisz.
Zaprezentuj to graficznie na ow kartce.
Potem kod juz sie sam bedzie pisal.

0

"Pomysl w jaki sposob to zrobisz." i w tym tkwi problem, że nie wiem w jaki sposób to zrobić.

1

Na powaznie?

integer maxr, maxl;
eldrzewa* L, R;

funkcja(eldrzewa*)
   if(L!=nil) maxl = funkcja(drzewo->L)
   if(R!=nil) maxr = funkcja(drzewo->R)
   zwroc maxl >= maxr ? maxl : maxr;

mniej wiecej cos takiego.

Edit: dorzuce wiki: http://pl.wikipedia.org/wiki/Przechodzenie_drzewa

0
int searchMax(drzewo d)
{
	int maxL, maxR;
    if (d==NULL)
        return -1;
    maxL = searchMax(d->left);
    maxR = searchMax(d->right);
    if(d->key > maxL && d->key > maxR )
       return d->key;
    else
       return maxL >= maxR ? maxL : maxR;
}

Działa. Dzięki wielkie za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1