Re: C: обойти бинарное дерево рекурсией
От: Кодт Россия  
Дата: 09.06.08 13:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>На С++ можно вот так, а как на С?


На С++ можно проще.
using namespace std; // чтоб в глазах не рябило

typedef set<string> dict_type;
dict_type dictionary;
void init()
{
    dictionary.insert("hi");
    dictionary.insert("hello");
    .....
}

string coprefix(string s) // лексикографически следующая строка за строками с префиксом s
{
    while(!s.empty() && s.back()=='\xFF')
        s.pop_back();
    if(!s.empty())
        ++s.back();
    return s;
}
// работа этой функции очень проста:
// "ABCяяя" --> "ABD" (где, в некоей кодировке, 'я'==0xFF)
// "ABCDEF" --> "ABCDEG"
// "" --> "" - особый случай, пустой префикс накрывает весь диапазон
// "яяя" --> "" - не существует бОльшей строки, поэтому тоже превращаем в особый случай

typedef dict_type::const_iterator dict_iter;
pair<dict_iter,dict_iter> find_by_prefix(string s)
{
    dict_iter const i = dict.lower_bound(s);
    
    string const s1 = coprefix(s);
    dict_iter const j = next.empty() ? dict.end() : dict.lower_bound(s1);
}


А>И еще подскажите с вот такой регуляркой \x — это что такое?


Это 16-ричный код символа, '\xhh'. Например, '\x1B' = char(27) = ESC.
А '\ooo' где o=0..7 — восьмеричный код. '\33', '\033' = char(27) = ESC.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.