2015-05-01 3 views
1

Для класса я должен создать двоичное дерево объектов состояния, каждое из которых включает в себя двоичное дерево резидентных объектов, организующих людей, которые живут в каждом штате. Я пытаюсь найти общее дерево состояний для человека по имени (как государственные, так и резидентные деревья организованы в алфавитном порядке по имени), который включает в себя перемещение всего дерева состояний и поиск дерева резидентного состояния для указанного лица. Очевидно, что обход дерева дерева не работает, потому что большую часть времени он говорит мне, что человек не находится в базе данных (т. Е. Мой метод stateforperson, указанный ниже, дерева возвращает NULL), когда я знаю, что они существуют в базе данных. Я уверен, что мой метод searchfor() работает.Обход двоичного дерева (в основном) Неудача

node <Person*> * stateforperson (string nm, node <T> * n) 
{ if (n != NULL) 
    { 
     node <Person*> * person = n->data->residents->searchfor(nm); 
     if (person != NULL) 
      return person; 
     return stateforperson(nm, n->left); 
     return stateforperson(nm, n->right); 
    } 
    else 
     return NULL; 
} 

Покушение Update:

node <Person*> * stateforperson (string nm, node <T> * n) 
{  if (n != NULL) 
     { 
      node <Person*> * person = n->data->residents->searchfor(nm); 
      if (person != NULL) 
       return person; 
      // Here, you explore the left branch and get the results. 
      node <Person*> * left_ret = stateforperson(nm, n->left); 
      // Here, same with right branch. 
      node <Person*> * right_ret = stateforperson(nm, n->right); 
      // You now have both results. 
      if (left_ret != NULL) // If a result was found in left branches, you return that person. 
       return left_ret; 
      else if (right_ret != NULL) // Same with right branch. 
       return right_ret; 
      else // The problem was here. Before you returned uninitialized memory. (because there wasn't a specified return value. 
      // Now, you return a NULL pointer if nothing was found. 
      //So you detect that no person was found and don't use unitialized memeory. 
       return (NULL); 
       } 
       else 
        return NULL; 
    } 
+0

Так не название государства не предусмотрено? Вам просто нужно искать каждое дерево состояний? –

+1

Yup. Профессор знает, что я знаю, как искать государство; теперь он тестирует, можно ли искать деревья в деревьях и разбираться с обходами, которые необязательно требуют определенного порядка для них. – jiccan

ответ

4

Я считаю, что то, что происходит в том, что вы только исследовать левые узлы. Никогда не правильно, потому что вы возвращаетесь раньше:

 return stateforperson(nm, n->left); 
    // Here you just return the left part. Never reaching the following line 
    return stateforperson(nm, n->right); 

Попробуйте на самом деле хранения ценностей и что-то подобное:

left_ret = stateforperson(nm, n->left); 
    right_ret = stateforperson(nm, n->right); 

Than делать все проверки вам нужно сделать на ваших переменных, чтобы вернуть правильный.

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

+0

Не выглядит ошибкой, так как перемещение дерева вызовов до конца влево в конечном итоге возвращает левое лицо, или 'NULL' – David

+0

Да, левое лицо. Но он никогда не проверяет правильную часть дерева. Так реалистично, он исследует 30% своего дерева. Поэтому, конечно, не найти человека, которого он нуждается. В некоторых случаях он это сделает. Если человек находится в левой ветке. – Khaldor

+0

Это то, что мне нужно, чтобы разорвать обход, чтобы вернуться только в том случае, если имя человека было найдено в текущем посещении; в противном случае продолжайте двигаться дальше. Если обе половины дерева были обысканы, и все еще человек никогда не был найден, ТОЛЬКО Я ТОЛЬКО хочу вернуть 'NULL'. Поэтому я действительно не знаю, как заставить его искать как влево, так и вправо и возвращаться только в том случае, если человек находится в одном из состояний. Имеет ли это смысл? Другими словами, я даже не знаю, какие проверки я буду делать на 'left_ret' или' right_ret'. Эта рекурсия для меня не имеет смысла. – jiccan

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

  • Нет связанных вопросов^_^