Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2011, 21:14   #1
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию удаление элемента в бинарном дереве

есть у кого написанная функция, которая всегда работает правильно?
бьюсь уже два дня
то корень не удаляет, то что-нибудь еще.

вот код:
Код:
			void _delete_element_with_key( T1 key, node<T1, T2>* root )
			{
				node<T1, T2> * pointer = root;
				node<T1, T2> * parent  = NULL;
		 
				while (pointer != NULL && pointer -> key != key)
				{
						parent = pointer;
						if (key < pointer -> key)
								pointer = pointer -> left;
						else
								pointer = pointer -> right;
				}
		 
				if (pointer != NULL)
				{
					if ( parent == NULL )
					{
						delete pointer;
						--_size;
						return;
					};

					if ( pointer -> left == NULL && pointer -> right == NULL )					//	если нет ни одного из детей
					{
						if ( parent -> left == pointer ) parent -> left = NULL;
						else parent -> right = NULL;
						delete pointer;
						--_size;
						return;
					};

					if ( pointer -> left == NULL && pointer -> right != NULL )					//	если нет левого потомка но есть правый
					{
						if ( parent -> left == pointer ) parent -> left = pointer -> right;
						else parent -> right = pointer -> right;
						delete pointer;
						--_size;
						return;
					};

					if ( pointer -> right == NULL && pointer -> left != NULL )
					{
						if ( parent -> left == pointer ) parent -> left = pointer -> left;
						else parent -> right = pointer -> left;
						delete pointer;
						--_size;
						return;
					};

					if ( pointer -> right != NULL && pointer -> left != NULL )
					{
						if ( pointer -> right -> left == NULL )
						{
							node<T1, T2>* removed = pointer -> right;
							pointer -> element = pointer -> right -> element;
							pointer -> key = pointer -> right -> key;
							pointer -> right = pointer -> right -> right;
							delete removed;
							--_size;
						}
						else
						{
							node<T1, T2>* mostLeft = pointer -> right;
							node<T1, T2>* mostLeftParent = pointer;
	                        
							while (mostLeft -> left != NULL)
							{
									mostLeftParent = mostLeft;
									mostLeft = mostLeft->left;
							}
	 
							pointer -> key = mostLeft -> key;
							pointer -> element = mostLeft -> element;
							mostLeftParent -> left = mostLeft -> right;
							_delete_element_with_key( mostLeft -> key, mostLeft );
						};
						return;
					};
				};
			};
работает правильно, но не правильно удаляет если удаляемый элемент вершина дерева.
Kukurudza вне форума Ответить с цитированием
Старый 26.06.2011, 22:51   #2
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

вроде исправил. вот вдруг кому понадобится. если работает не правильно, прошу отпишитесь!!
Код:
			void _delete_element_with_key( T1 key, node<T1, T2>* root )
			{
				node<T1, T2> * pointer = root;
				node<T1, T2> * parent  = NULL;
		 
				while (pointer != NULL && pointer -> key != key)
				{
						parent = pointer;
						if (key < pointer -> key)
								pointer = pointer -> left;
						else
								pointer = pointer -> right;
				}
		 
				if (pointer != NULL)
				{
					if ( parent == NULL )
					{
						if ( pointer -> left == NULL && pointer -> right == NULL )					//	если нет ни одного из детей
						{
							delete _root;
							_root = NULL;
							_size = 0;
							return;
						};

						if ( pointer -> left == NULL && pointer -> right != NULL )					//	если нет левого потомка но есть правый
						{
							parent = _root;
							_root = _root -> right;
							delete parent;
							--_size;
							return;
						};

						if ( pointer -> right == NULL && pointer -> left != NULL )
						{
							parent = _root;
							_root = _root -> left;
							delete parent;
							--_size;
							return;
						};

						if ( pointer -> right != NULL && pointer -> left != NULL )
						{
							if ( pointer -> right -> left == NULL )
							{
								node<T1, T2>* removed = pointer -> right;
								pointer -> element = pointer -> right -> element;
								pointer -> key = pointer -> right -> key;
								pointer -> right = pointer -> right -> right;
								delete removed;
								--_size;
								return;
							}
							else
							{
								node<T1, T2>* mostLeft = pointer -> right;
								node<T1, T2>* mostLeftParent = pointer;
		                        
								while (mostLeft -> left != NULL)
								{
										mostLeftParent = mostLeft;
										mostLeft = mostLeft->left;
								}
		 
								pointer -> key = mostLeft -> key;
								pointer -> element = mostLeft -> element;
								mostLeftParent -> left = mostLeft -> right;
								delete mostLeft;
								--_size;
								return;
							};
						};
					};

					if ( pointer -> left == NULL && pointer -> right == NULL )					//	если нет ни одного из детей
					{
						if ( parent -> left == pointer ) parent -> left = NULL;
						else parent -> right = NULL;
						delete pointer;
						--_size;
						return;
					};

					if ( pointer -> left == NULL && pointer -> right != NULL )					//	если нет левого потомка но есть правый
					{
						if ( parent -> left == pointer ) parent -> left = pointer -> right;
						else parent -> right = pointer -> right;
						delete pointer;
						--_size;
						return;
					};

					if ( pointer -> right == NULL && pointer -> left != NULL )
					{
						if ( parent -> left == pointer ) parent -> left = pointer -> left;
						else parent -> right = pointer -> left;
						delete pointer;
						--_size;
						return;
					};

					if ( pointer -> right != NULL && pointer -> left != NULL )
					{
						if ( pointer -> right -> left == NULL )
						{
							node<T1, T2>* removed = pointer -> right;
							pointer -> element = pointer -> right -> element;
							pointer -> key = pointer -> right -> key;
							pointer -> right = pointer -> right -> right;
							delete removed;
							--_size;
						}
						else
						{
							node<T1, T2>* mostLeft = pointer -> right;
							node<T1, T2>* mostLeftParent = pointer;
	                        
							while (mostLeft -> left != NULL)
							{
									mostLeftParent = mostLeft;
									mostLeft = mostLeft->left;
							}
	 
							pointer -> key = mostLeft -> key;
							pointer -> element = mostLeft -> element;
							mostLeftParent -> left = mostLeft -> right;
							delete mostLeft;
							--_size;
						};
						return;
					};
				};
			};
Kukurudza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчет уровней в бинарном дереве holi10 Общие вопросы C/C++ 0 01.06.2011 18:22
логическая функция same(t), определяющая, есть ли в бинарном дереве T хотя бы два одинаковых элемента 123456789igor Паскаль, Turbo Pascal, PascalABC.NET 1 30.05.2011 00:22
Посчитать количество вершин в бинарном дереве goo Фриланс 2 26.02.2011 20:01
Поиск в бинарном дереве не по ключу lebrosha Помощь студентам 2 26.05.2009 15:32
Удаление вершины в бинарном дереве lebrosha Помощь студентам 2 24.05.2009 13:51