Поиск данных в двоичном дереве, которое не построено вокруг искомого типа данных - PullRequest
1 голос
/ 30 апреля 2020

У меня есть двоичное дерево, в котором данные каждого узла основаны на людях (имя и фамилия, почтовый индекс, ssn и дата рождения). Это дерево было основано на имени и фамилии этих людей при создании (сравнение строк с меньшим направлением влево), но мне нужно найти самого старого человека в том же двоичном дереве. Мой текущий код ниже, и я думаю, что я на правильном пути логически. Прямо сейчас это просто возвращает ошибку с rightold и leftold не NULL, но каково должно быть их начальное значение? В моей логи c есть недостаток, как она сейчас стоит? Я сейчас действительно в замешательстве и некоторое время настраивал это. Заранее спасибо !!

PS - значение даты - это комбинация YYYYMMDD в виде целого числа, поэтому я хочу, чтобы наименьшее значение даты было моим самым старым в сравнениях.

node * Tree::oldest(node * x)
{ 
   node * rightold, * leftold, * res, * finalRes; 
   if (x -> right != NULL)
   {
      rightold = oldest (x->right); 
   }
   else if (x -> left != NULL)
   {
       leftold = oldest (x->left);
   }
   if (rightold -> date < leftold -> date)
        res = rightold;
   else
       res = leftold;
   if (res -> date < x -> date)
       finalRes = res;
   else
       finalRes = x;
   return finalRes; 
}

1 Ответ

0 голосов
/ 30 апреля 2020

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

Вместо:

node * rightold, * leftold, * res, * finalRes; 
if (x -> right != NULL)
{
   rightold = oldest (x->right); 
}
else if (x -> left != NULL)
{
    leftold = oldest (x->left);
}

try:

node * rightold = NULL, * leftold = NULL, * res = NULL, * finalRes = NULL; 
if (x->right) rightold = oldest (x->right); 
if (x->left)   leftold = oldest (x->left);

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

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