Динамическая структура : бинарное дерево. Требуется помощь в поиске ош

  • Автор темы llerik
  • Дата начала
L

llerik

#1
Дали задание:
Англо-русский словарь построен в виде вдоичного дерева.
Каждая компонента содержит английское слово, соответствующее ему русское слово и счетчик количества обращений к данной компоненте.
Первоначально дерево формируется в порядке английского алфавита. В процессе эксплуатации словаря при каждом обращении к компоненте к счетчику обращений прибавляется единица.
Написать программу, которая:
1) обеспечивает начальный ввод словаря с конкретными значениями счетчика обращений;
2) формирует новое представление словаря в виде двоичного дерева по следующему алгоритму:
а) в старом словаре ищется компонента с наибольшим значением счетчика обращений;
б) найденная компонента заносится в новый словарь и удаляется из старого;
в) переход к пункту а) до исчерпания исходного словаря.
3) Производит вывод исходного и нового словарей.
Программа должна обеспечивать диалог с помощью меню и кантроль ошибок при вводе.

Попытался его решить и вот во что это вылилось...
Код программы:
[codebox]#include <vcl.h>
#include <iostream.h>
#include <string.h>
#pragma hdrstop
#pragma argsused
using namespace std;
// Структура:
struct tree
{
string eng; //слово
int count; //количество обращений
tree *left;
tree *right;
};
string temp_eng;
int temp_count;
const int level=0;
// Функция поиска и добавления элемента
tree *search_insert (tree *root, string eng, int count);
// Функция показа дерева
void print_tree (tree *p, int level);
//---------------------------------------------------
// Главная функция:
int main()
{
int vibor;
tree *root=NULL;
do {
cout<<"Najmite: "<<endl;
cout<<"1| Dobavit slovo v slovar"<<endl;
cout<<"2| Vihod"<<endl;
cin>>vibor;
switch (vibor)
{
case 1: {cout<<"Vvedite angliskoe slovo: "<<endl;
cin>>temp_eng;
cout<<"Vvedite znachenie schetchika: "<<endl;
cin>>temp_count;
//создание дерева
root=search_insert (root, temp_eng, temp_count);
print_tree (root, level);
}; break;
case 2: break;
default: return 1;
}
}
while (vibor!=2);
delete root;
return 0;
}
// Функция поиска и добавления элемента в дерево:
tree *search_insert (tree *root, string temp_eng, int temp_count)
{
tree *pv, *prev;
bool found=false;
pv=root;
//поиск по дереву:
while (pv!=0 && found==false) {
prev=pv;
if (temp_eng==pv->eng) found = true;
else if (temp_count < pv->count) pv=pv->left;
else pv=pv->right;
}
if (found==true) return pv;
//создание нового узла
tree *pnew=new tree;
pnew->eng=temp_eng;
pnew->count=temp_count;
pnew->left=0;
pnew->right=0;
if (pv!=0) {if (temp_count < prev->count)
prev->left=pnew; //присоединение к левому поддереву предка
else prev->right=pnew;} //присоединение к правому поддереву предка
return pnew;
}
// Функция показа дерева
void print_tree (tree *p, int level)
{
//не равно 0:
if (p!=0)
print_tree(p->left, level+1);
for (int i=0; i<level; i++)
cout<<" ";
//не равно 0:
if (p!=0)
cout<<p->eng<<" "<<'('<<p->count<<')'<<endl<<endl;
//равно 0:
else cout<<'@'<<endl<<endl;
if (p!=0) print_tree (p->right, level+1);
}[/codebox]
Теперь о том, что здесь написано, что получается и что должно получиться:

Приведенный выше код у меня работает, т.е. запускается.
И так, после запуска программы на экране появляется:
Najmite:
1| Dobavit slovo v slovar
2| Vihod
//Жмем 1
Vvedite angliskoe slovo:
//вводим абракадабру, для экономии времени (на англ. раскладке), вида: "dkgdsgkds" (без кавычке)
Vvedite znachenie schetchika:
//вводим число, например 45
//Появляется результат (т.е. полученное дерево) вида:
Код:
		@ 
dkgdsgkds (45) 
@
//Значком "@" я решил обозначить "пустых потомков", или их отсутствие, иначе говоря.
//После чего можно повторить то же самое, в результате мы всегда будем получать то, что ввели в последний раз.

В идеале это должно было бы выгледеть примерно так:
Код:
				@ 
ldkghld (12)		 
@ 
dkgdsgkds (45) 
@		 
dkghdk (60) 
@
И как всегда два вопроса: кто виноват и что делать?
P.S. Работаю в Builder С++ 6.0 (компилятор по дефолту).