2015-11-01 4 views
0

У меня есть простое цифровое дерево определяется следующим образом:найти самое длинное слово в цифровом дереве с помощью рекурсии

class DTN { 
    public: 
    DTN() : 
     is_word(false), word_to_here(""), children() 
    {} 
    DTN (bool iw, std::string wth) : 
     is_word(iw), word_to_here(wth), children() 
    {} 
    bool      is_word; 
    std::string    word_to_here; 
    Map<char,DTN> children; 
}; 

Я имею проблему, чтобы определить функцию, называемую longest_word (Const DTN & ЦТС), которые предполагают, чтобы вернуться самое длинное слово в цифровом дереве с итератором и рекурсией, показано следующим образом:

std::string longest_word (const DTN& dtn) { 
    std::string lw = dtn.word_to_here; 
    for(auto s:dtn.children){ 
     if(s.second.is_word && lw.length()<s.second.word_to_here.length()){ 
      lw = longest_word(s.second); 
     } 
     longest_word(s.second); 
    } 
    return lw; 
} 

Предположит у нас есть три слова в цифровом дереве ЦТСА: (ант, муравьед, anthebellum), и вызов longest_word (ЦТС) будет дайте мне пустую строку "" вместо "anthebellum". Может ли кто-нибудь указать, что я сделал неправильно в функции longest_word? С фактическим кодом будет оценено, потому что мой английский не очень хорош, коды мне легче понять. Заранее спасибо.

+0

Это не выглядит достаточно - дети типа? NTN против DTN? – mksteve

+0

Мне очень жаль, я поставил здесь неправильный класс, я обновляю правильный. – Saoish

ответ

1

Алгоритм для longest_word полностью неверен. Вы должны проверить всех детей longest_words и вернуть ту, которая длиннее. Вы не можете вернуться до завершения цикла для детей. Обратите внимание, что ваш алгоритм всегда будет возвращать первые дети. Я даже не понимаю, почему вы проверяете полное слово ...

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