Поиск бинарного дерева поиска - на основе массива - PullRequest
1 голос
/ 06 декабря 2009

Я пытаюсь найти слово по значению ключа рекурсивно. В функции извлечения: Проблема в том, что индекс идет от 0, 1,3,7, до 15 .... предполагается, что идти 0,1,3,7,8 и т. Д. У меня вставка работает как положено. У меня есть заказ, предварительные заказы, все работает. Может кто-нибудь помочь мне разобраться с этой проблемой? Я работаю над этим уже 4 дня! Я понимаю, что это идет слева направо. Проблема в том, что он не пойдет сразу после левого. Я только добавлю функции и код, который, как мне кажется, вам понадобится, чтобы помочь мне .. Я использую 2 retireve для выполнения рекурсии.

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

retrieve(key, aData, parent);

if (key == aData)
{
    return true;
}
else
{
    return false;
}

}

другой получить

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


if (!items[parent].empty )
{

    if (key == items[parent].instanceData.getName())
    {
        aData.setName(key);
        return true;
    }
    else if (key < items[parent].instanceData.getName() ) // changed -- now goes from 0,2,6 suppose to go to o,2,5
    {
        parent =(2*parent) + 1;
        retrieve(key, aData, parent);
    }
    else
    {
        parent =( 2*parent) + 2;
        retrieve(key, aData, parent);
    }
//  return 0;

} 
}

== операторская функция ..

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

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

}

и вот один из моих заголовочных файлов ..

 #include "data.h"

 class BST                               
 {
 public:
BST(int capacity = 5);              // constructor (default if no arg supplied)
BST(const BST& aTable);             // copy constructor
~BST();                             // destructor

void insert(const data& aData);     
bool remove(const char *key);
bool retrieve(const char *key, data& aData) const;
void displayArrayOrder(ostream& out) const;     
void displayPreOrder(ostream& out) const;
void displayInOrder(ostream& out) const;
void displayPostOrder(ostream& out) const;
int getSize(void) const;

    private:

  int size;
  int maxsize;  
  int parent;


  void expand();

struct item
{
    bool    empty;
    data instanceData;
    bool  isLeaf;
};

item *items;

void insert(int index, const data & aData ); 
void displayHeaders(ostream& out)const;
void BST::displayPreOrder(std::ostream &out, int parent)const;
void BST::displayInOrder(std::ostream &out, int parent)const;
void BST::displayPostOrder(std::ostream &out, int parent)const;
bool BST::retrieve(const char *key, data& aData, int parent) const;
void itemsPrinted(ostream &out,int size)const;
  };


 #endif // BST_H

часть функции main () ..

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);    // calls search function..

и

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

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


}

1 Ответ

2 голосов
/ 06 декабря 2009

предполагается перейти на 0,1,3,7,8

Почему вы ожидаете такого поведения? Это не «бинарный» поиск вообще. Лему ребенку 7 лет будет 15 лет, правому ребенку будет 16. 8 - правый ребенок 3 лет.

Ваш код выглядит правильно. Ваши результаты выглядят правильно. Это ваши ожидания, которые кажутся ошибочными.

...