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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2011, 18:11   #1
Ktulu
 
Регистрация: 22.12.2010
Сообщений: 5
По умолчанию С++ длиннейший путь в шаблонном дереве

Здравуствуйте. Нужно написать функцию, которая бы возвращала самый длинный путь (путь от корня до листа) в дереве в виде массива элементов. Сколько пытаюсь ничего не получается, помогите пожалуйста. Вот сам класс.
Код:
#pragma once
#include <iostream>
using namespace std;

template <class T>
struct Elem
	{
		T info;
		Elem *left, *right;
	};
template <class T>
class BinTree
{	
private:
	Elem<T>*root;
	void RInsert (Elem<T>*&, const T&);
	void RDelete (Elem<T>*&, const T&);
	void Delete2 (Elem<T>*, Elem<T>*);
	void Copy (Elem<T>*&, Elem<T>*);
	void Print (ostream &out, const Elem<T>*tr) const;
	char* RlongWay (Elem<T>*&, const T&);
	void RMakeEmpty (Elem<T>*&);
public:	
	BinTree(void);
	~BinTree(void);
	BinTree (const BinTree<T>&Tr);
	void Insert (const T&);
	void Delete (const T&x);
	char* longWay ();
	void MakeEmpty ();
	BinTree<T>& operator =(const BinTree <T>&);
	friend istream& operator >> <T> (istream &, BinTree<T>&);
	friend ostream& operator << <T> (ostream &, const BinTree <T>&);
	
};
template <class T>
BinTree<T>::BinTree()
	{

		root=NULL;
			
	}

template <class T>
BinTree<T>::~BinTree()
{
	MakeEmpty ();
}
template <class T>
BinTree<T>::BinTree (const BinTree<T>&Tr)
{
	root=0;
	Copy(root,Tr.root)
}
template <class T>
void BinTree<T>::Insert(const T&x)
{
	RInsert(root,x);
}
template <class T>
void BinTree<T>::Delete(const T&x)
{
	RDelete(root,x);
}
template <class T>
void BinTree<T>::MakeEmpty()
{
	RMakeEmpty (root);
}
template <class T>
void BinTree<T>::RMakeEmpty (Elem<T>*&Tr)
{
	if (Tr)
	{
		RMakeEmpty (Tr->left);
		RMakeEmpty (Tr->right);
		RDelete (Tr, Tr->info);
	}
}
template <class T>
void BinTree<T>::RInsert(Elem<T>*&Tr,const T&x)
{
        if (Tr)
        {
			if (x<Tr->info)
			{
				RInsert(Tr->left,x);
			}
			else if (x>Tr->info)
			{
				RInsert (Tr->right,x);
			}
			else
			{
				return;
			}
		}
		else
		{
			if (!(Tr=new Elem<T>))
			{
				throw 1;
			}
			Tr->info=x;
			Tr->left=Tr->right=0;
		}
		
}
template <class T>
void BinTree<T>::RDelete(Elem<T>*&Tr,const T&x)
{
	if (!Tr)
	{
		return;
	}
	if (x<Tr->info)
	{
		RDelete (Tr->left,x);
	}
	else
	{
		if (x>Tr->info)
		{
			RDelete (Tr->right,x);
		}
		else
		{
			Elem<T>*p=Tr;
			if (!Tr->right)
			{
				Tr=Tr->left;
			}
			else
			{
				if (!(Tr->left))
				{
					Tr=Tr->right;
				}
				else
				{
					Delete2 (Tr->left,p);
				}
			}
		}
	}
}
template <class T>
void BinTree<T>::Delete2(Elem<T>*p, Elem<T>*q)
{
	if (p->right)
	{
		Delete2 (p->right,0);
	}
	else
	{
		q->info=p->info;
		q=p;
		p=p->left;
	}
}
template <class T>
void BinTree <T>::Copy(Elem<T>*&T1, Elem<T>*T2)
{
	if (!T2)
	{
		return;
	}
	RInsert(T1,T2->info);
	Copy(T1,T2->left);
	Copy(T1,T2->right);
}
template <class T>
void BinTree<T>::Print(ostream &out, const Elem<T> *tr) const
{
	if (!tr)
	{
		return;
	}
	Print(out,tr->right);
	out<<tr->info<<" ";
	Print(out, tr->left);
}
template<class T>
BinTree<T>&BinTree<T>::operator =(const BinTree<T>&Tr)
{
	if (this==&Tr)
	{
		return*this;
	}
	MakeEmpty();
	Copy(root,Tr.root);
	return*this;
}
template<class T>
ostream& operator << (ostream &out, const BinTree<T>&Tr)
{
	if(!Tr.root)
	{
		return out;
	}
	Tr.Print (out,Tr.root);
	return out;
}
template <class T>
istream& operator >> (istream& in, BinTree<T>&Tr)
{
	T x;
	do
	{
		in>>x;
		Tr.Insert(x);

	}
	while (in.peek()!=10);

	return in;
}

Последний раз редактировалось Ktulu; 15.05.2011 в 18:16.
Ktulu вне форума Ответить с цитированием
Старый 16.05.2011, 00:09   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Весьма интересно, что делать в случае, если таких путей несколько?
mMAg вне форума Ответить с цитированием
Старый 16.05.2011, 12:51   #3
Ktulu
 
Регистрация: 22.12.2010
Сообщений: 5
По умолчанию

Я не знаю, у меня в задании это не оговорено, я когда думал, то хотел сразу приоритет расставить, ну то есть, если оба поддерева равны, то максимальным будет считаться правым, если внутри поддерева есть два равных пути, то тоже по умолчанию отдавать приоритет правому (ну или левому не суть важно)
Ktulu вне форума Ответить с цитированием
Старый 16.05.2011, 17:02   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Ну так и в чем проблема? Это ж лаба, а не производственная задача. За временем не гонитесь? Самый простой способ: это узнать количество уровней дерева первым проходом (скажем, левым обратным). Затем при встрече вершины, лежащей на нижнем уровне раскрутить рекурсию в обратном порядке с запоминанием вершин в стеке, чего ж проще то? Очень сомнительно, что человек, написавший функцию RDelete, например, не сможет написать этого.
mMAg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка оператора в шаблонном классе alex_alpha Общие вопросы C/C++ 0 12.08.2010 21:37
Алгоритм поиска вершины в дереве FPMI_BSU Помощь студентам 1 11.02.2010 03:33
Удаление вершины в бинарном дереве lebrosha Помощь студентам 2 24.05.2009 13:51
помогите с индексами в дереве! Анастасия123456789 Общие вопросы Delphi 1 26.11.2008 15:26
как в дереве ставятся индексы.. Анастасия123456789 Общие вопросы Delphi 12 24.11.2008 16:33