Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.205.56.209] |
|
Сообщ.
#1
,
|
|
|
Всем хай! Сходу к делу!
Хапнул проблему в какой-то простой ситуации ( а может она и непростая ). Есть обыкновенное описание узла бинарки: typedef struct Node { int key; struct Node* left; struct Node* right; } Node; И есть рекурсивная функция обхода ( корень, левое поддерево, правое поддерево ). Именно такой обход ( но это, думаю не важно ). void root_left_right( const Node* const root ) { // static int number = 0; if( root ) { printf( "%d\t%d\n", number, root -> key ); root_left_right( root -> left ); root_left_right( root -> right ); } } И надо добавить сквозную нумерацию печатаемых узлов дерева. Например: 1 50 2 30 3 -17 4 100 ... но НЕ получается сделать нормально эту нумерацию, уже перепробовал 2-3 способа. Ближе всех был вариант со static, но при повторном вызове печати нумерация продолжалась, разумеется, а не сбрасывалась опять на 1. уровни без проблем получается выводить ( через параметры ), а здесь что-то не получается Глобальные переменные использовать нельзя. Подскажите как быть-то, буду оч. признателен Добавлено победил так: void root_left_right( int* number, const Node* const root ) { // static int number = 0; if( root ) { printf( "%d\t%d\n", ( *number )++, root -> key ); root_left_right( number, root -> left ); root_left_right( number, root -> right ); } } подсмотрел этот подход на примере подсчета количества листьев процедуры на Паскаль. надо же, работает, как надо, пойду думать, почему это работает... а в целом это, ИМХО, оч.интересное применение указателя) |
Сообщ.
#2
,
|
|
|
т е все копии функции root_left_right разделяют один и тот же указатель - это красиво, и почему сразу до этого не догадался
в очередной раз рекурсия меня поражает емкостью своего решения + невозможно найти в IT более сложную вещь в такой ЕМКОЙ форме, имхо) зы: помню, увидел рекурсивную процедуру переложения колец при решении задач "Ханойские башни", там 5-7 строк кода, наверное, часов 5-6 смотрел, думал, курил, смотрел в окно, что-то рисовал, так вроде и не понял на 100%, но зазубрил хорошо |