2016-07-23 3 views
0

Я медленно писал программу и пытался научить себя бинарным деревьям. Эта программа представляет собой телефонную книгу, которая использует дерево для хранения своих данных. В настоящее время я застрял в функции findOrInsert. Первоначально я просто вставлял данные в открытую область. Теперь я хочу проверить, существуют ли эти данные до их добавления. Если это произойдет, просто вернитесь из функции, запрашивающей пользователя, уже были те же данные. Я пробовал несколько вещей, но не повезло. Я могу просто попытаться переписать его с нуля. До этого я хотел посмотреть, смогу ли я получить какую-либо помощь.Двоичное дерево: поиск тех же значений

Это то, что у меня есть.

struct treeNode * findOrInsert(struct treeNode *p, Entry e) { 

    if (p == NULL) { 
     p = createNode(NULL, NULL, e); 
    } 
    else if (strcmp(e.fName, p->data.fName) < 0) { 
     p->left = findOrInsert(p->left, e); 
    } 
    else if (strcmp(e.fName, p->data.fName) > 0) { 
     p->right = findOrInsert(p->right, e); 
    } 
    else { 
     if (strcmp(e.lName, p->data.lName) < 0) { 
      p->left = findOrInsert(p->left, e); 
     } 
     else if (strcmp(e.lName, p->data.lName) > 0) { 
      p->right = findOrInsert(p->right, e); 
     } 
     else { 
      return p; 
     } 
    } 
    return p; 
} 

struct treeNode * createNode(struct treeNode *q, struct treeNode *r, Entry e) { 
    struct treeNode * newNode; 
    newNode = (struct treeNode*)(malloc(sizeof(struct treeNode))); 
    newNode->data = e; 
    newNode->left = q; 
    newNode->right = r; 
    return newNode; 
} 

Любая помощь приветствуется!

ответ

0

Почему бы не просто добавить еще один чек после

if (p == NULL) { 
    p = createNode(NULL, NULL, e); 
} 

видеть, равны ли первые и последние имена p и e? (предполагая, конечно, что каждая запись в вашем дереве имеет имя и фамилию). Я говорю после этого утверждения, потому что вы не хотите сравнивать нулевой объект с e. Итак, как только вы подтвердите, что существует p, вы должны проверить, соответствуют ли имена и фамилии e номерам p. Если да, то распечатайте, что e уже существует в дереве или что-то еще, и возвратите p, чтобы закончить рекурсию (альтернатива возвращению чего-то - это выбросить исключение, но это остановит выполнение программы). Он должен выглядеть примерно так:

else if (strcmp(e.fName, p->data.fName) == 0 && strcmp(e.lName, p->data.lName) == 0) { 
    printf("Entry already exists in tree"); 
    return p; 
} 
+1

Честно говоря, я пробовал это. Должно быть, что-то другое. Кажется, теперь это работает. Спасибо! – arthos455

Смежные вопросы