algorytm.org

Implementacja w C/C++

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Drzewa Poszukiwań Binarnych (BST) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 11
SłabyŚwietny
Nadesłany przez Bartosz Bednarczyk, 04 września 2011 11:11
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

bst_1_c.h:
/*
 * Bartosz "WiedźMAC" Bednarczyk
 * Liceum Ogólnokształcące im. Władysława Broniewskiego w Strzelcach Opolskich
 * Klasa reprezentująca binarne drzewo przeszukiwań (BST)
 * www.algorytm.org
 */

#include <cstdio>
#define NIL 99999999

#ifndef BST_H
#define BST_H

class BSTNode
{
	public:

	int key;
	BSTNode *parent, *left, *right;

	BSTNode( int k = NIL )
	{
		parent = left = right = NULL;
		key = k;
	}
};

class BST
{
	public :

	BSTNode *Root;

	void PreorderTreeWalk( BSTNode *x )
	{
		if( x != NULL )
		{
			printf("%d ", x->key);
			PreorderTreeWalk( x->left );
			PreorderTreeWalk( x->right );
		}
	}

	void PostorderTreeWalk( BSTNode *x )
	{
		if( x != NULL )
		{
			PostorderTreeWalk( x->left );
			PostorderTreeWalk( x->right );
			printf("%d ", x->key);
		}
	}

	void InorderTreeWalk( BSTNode *x )
	{
		if( x != NULL )
		{
			InorderTreeWalk( x->left );
			printf("%d ", x->key);
			InorderTreeWalk( x->right );
		}
	}

	BSTNode* Max( BSTNode *x )
	{
		while( x->right != NULL )
		{
			x = x->right;
		}

		return x;
	}

	BSTNode* Min( BSTNode *x )
	{
		while( x->left != NULL )
		{
			x = x->left;
		}

		return x;
	}

	BSTNode* Search( BSTNode *x, int k )
	{
		if( x == NULL || x->key == k ) return x;

		if( k < x->key ) return Search( x->left, k );
		else return Search( x->right, k );
	}

	BSTNode* Successor( BSTNode *x )
	{
		if( x->right != NULL ) return Min( x->right );
		else
		{
			BSTNode *y = x->parent;

			while( y != NULL && x == y->right )
			{
				x = y;
				y = y->parent;
			}

			return y;
		}
	}

	BSTNode* Predessor( BSTNode *x )
	{
		if( x->left != NULL ) return Max( x->left );

		BSTNode *y = x->parent;

		while( y != NULL && x == y->left )
		{
			x = y;
			y = y->parent;
		}

		return y;
	}

	void Clear(BSTNode *x)
	{
		if( x != NULL )
		{
			Clear( x->left );
			Clear( x->right);
			delete x;
		}
	}

	void Insert(BSTNode *InsertNode)
	{
		BSTNode *y = NULL;
		BSTNode *x = Root;

		while( x != NULL )
		{
			y = x;

			if( InsertNode->key < x->key )
			{
				x = x->left;
			}
			else
			{
				x = x->right;
			}
		}

		InsertNode->parent = y;

		if( y == NULL )
		{
			Root = InsertNode;
		}
		else
		{
			if(InsertNode->key < y->key)
			{
				y->left = InsertNode;
			}
			else
			{
				y->right = InsertNode;
			}
		}
	}

	void Delete( BSTNode *DeleteNode )
	{
		BSTNode *y = NULL;
		BSTNode *x = NULL;

		if( (DeleteNode->left == NULL) || (DeleteNode->right == NULL) )
		{
			y = DeleteNode;
		}
		else
		{
			y = Successor(DeleteNode);
		}

		if( y->left != NULL )
		{
			x = y->left;
		}
		else
		{
			x = y->right;
		}

		if( x != NULL )
		{
			x->parent = y->parent;
		}

		if( y->parent == NULL )
		{
			Root = x;
		}
		else
		{
			if(y == y->parent->left)
			{
				y->parent->left = x;
			}
			else
			{
				y->parent->right = x;
			}
		}

		if( y != DeleteNode )
		{
			DeleteNode->key = y->key;
		}

		delete y;
		y = NULL;

	}

	BST(void)
	{
		Root = NULL;
	}

	~BST(void)
	{
		Clear( Root );
	}
};

#endif
Komentarze
photo
0 # wiedzmac 2011-09-09 05:55
Zapraszam do komentowania - jeśli znajdziecie gdzieś błąd lub czegoś brakuje, albo coś jest niezrozumiałe - piszcie !
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # krzysiek22 2012-12-14 17:18
no przydaly by sie rotacje jeszcze
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-4 # Cytryna 2013-05-21 14:35
W metodzie Delete() oraz Clear() zamiast delete należy użyć destruktora bo to są obiekty.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz