поиск двоичного дерева поиска

голоса
0

Я пытаюсь найти имя в пределах ключа. Я думаю, что это получение его в порядке. Однако, его придумывают не найдено. может быть, мой код где-то не так?

if (database.retrieve(name, aData))  // both contain the match

в main()

static void retrieveItem(char *name, data& aData)
{
cout << >>> retrieve  << name << endl << endl;
if (database.retrieve(name, aData))            // name and aData both contain the match
    cout << aData << endl;
else
    cout << not found\n;
cout << endl;
     }

     static void removeItem(char *name)
    {
cout << >>> remove  << name << endl << endl;
if (database.remove(name))
    cout << name <<  removed\n;
else
    cout << name <<  not found\n;
cout << endl;
    }

   int main()
   {
   #ifdef _WIN32
// request memory leak report in Output Window after main returns
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
   #endif

data    aData;


     << Database Of Great Computer Scientists\n\n;

database.insert(data(Ralston, Anthony));
database.insert(data(Liang, Li));
database.insert(data(Jones, Doug));
database.insert(data(Goble, Colin));
database.insert(data(Knuth, Donald));
database.insert(data(Kay, Alan));
database.insert(data(Von Neumann, John));
database.insert(data(Trigoboff, Michael));
database.insert(data(Turing, Alan));
displayDatabase(true);
retrieveItem(Trigoboff, Michael, aData);
retrieveItem(Kaye, Danny, aData);

removeItem(Ralston, Anthony);
displayDatabase(true);

получить функцию ...

bool BST::retrieve(const char *key, data &aData, int parent) const
 {

for(int index=0; index < maxsize+1; index++)
{

    if (!items[index].empty) 
    {


        if ( items[index].instanceData == key )
        {
            aData.setName(key);
            return true;                   // doesn't return right away
        }


    }

}


 }

и определены в data.cpp

bool operator== (const data& d1, const data& d2)
{

return strcmp(d1.getName(), d2.getName()) == 0;

}

так что этот бит кода в основной (), где он говорит, что не нашел, когда я думаю, что это должно быть правильно работать. как имя и ADATA содержат правильное имя, которое было найдено ..

static void retrieveItem(char *name, data& aData)
{
cout << >>> retrieve  << name << endl << endl;
if (database.retrieve(name, aData))            // name and aData both contain the match
    cout << aData << endl;
else
    cout << not found\n;
cout << endl;
     }
Задан 05/12/2009 в 19:54
источник пользователем
На других языках...                            


3 ответов

голоса
0

Я не эксперт C ++, но ваш оператор == фактически оценивается? Это означало взять две константные ссылки данных, но по всей видимости, сравнивая то , что тип items[index].instanceDataявляется и char*.

Я предлагаю вам поставить некоторое протоколирование в оператор и посмотреть, если это на самом деле называют - я подозреваю, что это не так.

Один из вариантов, чтобы взять оператор == из уравнения временно было бы сделать сравнение явным:

 if (strcmp(items[index].instanceData.getName(), key) == 0)
 {
     ...
 }

В другой момент я не могу видеть , как это на самом деле делает бинарный поиск на всех. Она смотрит на меня , как это просто обычный список - вы делаете линейный поиск в пределах retrieveвместо сравнение ключа и идущий влево или вправо вниз по дереву (или возвращение «нашли») в зависимости от результата.

Ответил 05/12/2009 в 20:03
источник пользователем

голоса
0

Я не могу точно сказать, не видя код BST, но это выглядит не так:

for(int index=0; index < maxsize+1; index++)

С традиционными условностями, она должна быть:

for(int index=0; index < maxsize; index++)

Кроме того, она также кажется , ваша функция либо возвращает истину или некоторое неопределенное логическое значение. Вы , вероятно , следует иметь return false;в конце BST :: получить.

Ответил 05/12/2009 в 21:58
источник пользователем

голоса
1

Вы должны использовать BST для навигации по дереву - не цикл по каждому элементу в массиве, как говорят другие. Попробуйте что-то вроде:

bool retrieve(key, aData)
  retrieve(key, aData, parent)
  if (key == aData)
    return true
  else
    return false

bool retrieve(key, aData, parent)
  if (key == items[parent].name)
    aData.setName(key)
  else if (key < items[parent].name)
    retrieve(key, aData, 2*parent+1)
  else
    retrieve(key, aData, 2*parent+2)

Это должно работать хорошо! :)

Ответил 05/12/2009 в 23:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more