На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> вывести нумера узлов при печати бинарного tree search , C89 | C90, VS 2010, Win 10
    Всем хай! Сходу к делу!

    Хапнул проблему в какой-то простой ситуации ( а может она и непростая ).
    Есть обыкновенное описание узла бинарки:

    ExpandedWrap disabled
      typedef struct Node
      {
          int key;
          struct Node* left;
          struct Node* right;
      } Node;


    И есть рекурсивная функция обхода ( корень, левое поддерево, правое поддерево ). Именно такой обход ( но это, думаю не важно ).
    ExpandedWrap disabled
      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.

    уровни без проблем получается выводить ( через параметры ), а здесь что-то не получается :wall:
    Глобальные переменные использовать нельзя.

    Подскажите как быть-то, буду оч. признателен ;)

    Добавлено
    победил так:
    ExpandedWrap disabled
          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 );
              }
          }


    подсмотрел этот подход на примере подсчета количества листьев процедуры на Паскаль.
    надо же, работает, как надо, пойду думать, почему это работает...
    а в целом это, ИМХО, оч.интересное применение указателя)
      т е все копии функции root_left_right разделяют один и тот же указатель - это красиво, и почему сразу до этого не догадался :unsure:
      в очередной раз рекурсия меня поражает емкостью своего решения + невозможно найти в IT более сложную вещь в такой ЕМКОЙ форме, имхо)

      зы: помню, увидел рекурсивную процедуру переложения колец при решении задач "Ханойские башни", там 5-7 строк кода, наверное, часов 5-6 смотрел, думал, курил, смотрел в окно, что-то рисовал, так вроде и не понял на 100%, но зазубрил хорошо 8-)
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0202 ]   [ 17 queries used ]   [ Generated: 9.12.22, 23:21 GMT ]