Двоичное дерево поиска не работает - PullRequest
4 голосов
/ 28 сентября 2011

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

Вот упрощенный код (конечно, это не настоящий код):

#include <string.h>
#include <iostream>

using namespace std;

#define DIM1 2 

typedef enum {LEFT,RIGHT} direction;
typedef char tName[MAX_NAME_LEN + 1];

struct Rectangle {
  tName _name; 
  struct Rectangle *_binSon[DIM1];             
};

struct Rectangle *recTree;

void insertRectToTree(char str[]){  
    struct Rectangle rect;
    struct Rectangle *point;
    struct Rectangle *parent;
    strcpy(rect._name,str);
    rect._binSon[RIGHT] = NULL;
    rect._binSon[LEFT] = NULL;
    point = &rect;
    if (recTree == NULL){
       recTree = point;
    } else {
      struct Rectangle *current;
      current = recTree;
      while (current){
          parent = current;
          if (strcmp(point -> _name, current -> _name) > 0){
              current = current -> _binSon[RIGHT];
          } else {
              current = current -> _binSon[LEFT];
          }
      }
      if (strcmp(point -> _name, parent -> _name) < 0){
          parent -> _binSon[LEFT] = point;
      } else {
          parent -> _binSon[RIGHT] = point;
      }
      }
   }

int main(){
   recTree = NULL;
   char str[] = "LIKE";
   insertRectToTree(str);
   char str2[] = "GUIDE";
   insertRectToTree(str2);
   printf(recTree -> _name);
   return 0;
}

Как вы можете видеть, это двоичное дерево пытается организовать запись на основе его имени, поэтому наименьший алфавитный порядок будет идти слева и т. Д.

Проблема в том, что после первой вставки «LIKE» я хочу, чтобы «GUIDE» также вставлялся в дерево, а «LIKE» по-прежнему оставался корневым. Тем не менее, printf () показывает, что «GUIDE» становится корнем. (Другими словами, «GUIDE» - это выход). Есть хорошее объяснение этому? Спросите меня, нужно ли мне добавить еще кое-что к этому вопросу. Спасибо за всю твою помощь.

Ответы [ 2 ]

4 голосов
/ 28 сентября 2011

В следующих строках

struct Rectangle rect;
...
point = &rect;
...
recTree = point;

вы назначаете ссылку на локальную переменную для глобального указателя.После выхода из функции она может больше не содержать действительных данных.

1 голос
/ 28 сентября 2011

Говард прав. Но для исправления проблемы используйте новый.

т.е. вместо point = &rect;

Put point = new struct Rectangle;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...