2013-04-18 4 views
0

Здравствуйте, я столкнулся с проблемами, которые я, похоже, не могу решить. У меня есть BST, который я просматриваю и проверяю ряды. У меня есть метод checkRank(link head, targRank), который берет в головной узел и проходит через дерево, пока не найдет узел с равным ранга для targRank. Я пытаюсь сделать так, чтобы функция checkRank вернула текущий узел, на котором он нашел равный ранг. Какой был бы лучший способ достичь этого, потому что все мои попытки, похоже, возвращают текущий узел в голову?return current node from BST

typedef struct node* link; 

struct node 
{ 
    Item item; // Data for this node 
    link l, r; // left & right links 
    int rank; 
}; 

Func вызов:

link head; 
checkRank(head, 13); 

Func:

link checkRank(link h,int targetRank) 
{ 
    if (h != NULL) 
    { 
     if (h->rank < targRank) 
     { 
      checkRank(h->r, targRank); 
     } 


    if (h->rank > tarRank) 
     { 
      checkRank(h->l, targtRank); 
     } 

     if (h->rank == targRank) 
     { 
      return ??; 
     } 
    } 
    else 
    { 
     printf("Equiv rank could not be found\n"); 
    } 
} 

ответ

1

Прежде всего, вам нужно что-то return по каждому пути. Рассматривали ли вы что-то вроде следующего:

link check_rank(link h, int target) { 
    if (h == NULL) { 
    printf("equivalent rank could not be found\n"); 
    return NULL; 
    } 
    if (h->rank < target) 
    return check_rank(h->r, target); 
    if (h->rank > target) 
    return check_rank(h->l, target); 
    return h; 
} 

Функции всегда должны возвращать значение, и многие рекурсивные функции будут следовать образцу (1) возвращают часовому, чтобы остановить рекурсию, когда соответствующее условие выполнено или (2) recurse и вернуть все возвращаемые рекурсивные вызовы.

+0

Да, что сработало. Большое спасибо. – bardockyo