2014-01-02 7 views
0

Мне был предоставлен следующий код, чтобы сделать метод итератора для использования на двоичном дереве в C. Это значит применить функцию к каждому значению в двоичном дереве.Метод Итератора для двоичного дерева в C

int bst_char_iterate(bst_char *t, char (*fun)(char item))

«Bst_char * т» приравнивания к указателю на дереве, «* забава» приравнивания к указателю на вызов функции и «элемент» является значением, которое функция вызывается после.

Я думал, что итераторы действительно должны выполняться как недействительные функции, поэтому я теряюсь относительно того, как подойти к этому.

Пожалуйста, помогите!

Edit: Команда у меня была следующая:

Добавить новый метод в библиотеку, которая применяет функцию к каждому значению в дереве. (Это метод итератора для деревьев.)

INT bst_char_iterate (bst_char * т, символ (* весело) (голец пункт))

NB: Свойство BST будет сохранен только этим методом, если переданная ему функция монотонна. Функция f является монотонной, когда

x < = y (стрелка) f (x) < = f (y).

Edit 2: Следующие не работает для меня:

int bst_char_iterate(bst_char *t, char (*fun)(char item)) { 
    assert(t!=NULL); 
    struct node * p = t->root; 
    if (p!=NULL) { 
     p->item = fun(p->item); 
     p->left->item = bst_char_iterate(t,fun(p->left)); 
     p->right->item = bst_char_iterate(t,fun(p->right)); 
    } else { 
     return 0; 
    } 
} 

С довольно много ошибок. Может ли кто-нибудь помочь?

+0

Я не понимаю, что вы подразумеваете под «итераторами, которые действительно должны выполняться как функции пустоты». Похоже, вам нужно просто выполнить обход в порядке bst и 'node-> item = fun (node-> item)' на каждом узле. – Michael

+0

Были ли вы даны какие-либо рекомендации относительно того, что делать с возвращаемым значением '* fun' или то, что ваша функция должна в конечном итоге вернуться как' int'? – woolstar

ответ

0

Возможно, вам следует вернуть следующий элемент BST после данного элемента. Затем функция может быть вызвана снова с вновь возвращенным элементом, и она должна вернуть элемент после этого и так далее, пока вы не достигнете конца.

Поэтому вам нужно специальное значение, чтобы указать, что не осталось другого элемента; может быть 0?

3

Вы говорите, что хотите использовать метод «итератора», но затем вы описываете это как «применять функцию к каждому значению в дереве», что является методом «apply», а не «итератором». Метод итератора обычно ссылается на некоторый элемент структуры данных и возвращает ссылку на следующий элемент (или изменяет ссылку на место для ссылки на следующий элемент). Итак, вы хотите использовать настоящий метод итерации или хотите применить метод apply, который вы назовете «итерацией», таким образом запутав всех будущих читателей вашего кода?

Если последнее, вы хотите функцию, которая пересекает ваше дерево, вызывая функцию для каждого значения. Простой рекурсивный обход должен сделать трюк:

void bst_char_apply(bst_char *t, void (*fun)(char item)) { 
    if (t->left) bst_char_apply(t->left, fun); 
    fun(t->value); 
    if (t->right) bst_char_apply(t->right, fun); 
} 
+0

Это не так много глубины, как в порядке, не так ли? Думаю, пост-порядок будет «первым-первым» (спуститься вниз, прежде чем делать текущий уровень). –

+0

Да, сначала не глубина. Просто рекурсивный. –

+0

Несомненно, я могу просто сделать это в целочисленную функцию, добавив значение 'return t->;' to? – user3155247

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