2013-04-10 5 views
0

Я знаю, что это, вероятно, простой вопрос, но прошло какое-то время с тех пор, как я сделал какое-либо программирование на C. Я пытаюсь выполнить обход порядка на х узлах, где х - некоторое число, которое я передаю функции. Моя функция inorder вызывает себя рекурсивно и для моей жизни я не могу понять, как остановить обход после своих посещенных узлов x. Вот моя функция обхода порядка:traverse x количество узлов inorder

void inorder(node h) 
{ 

    if (h != NULL) 
    { 
     inorder(h->l); 

     printf(" %d\n",h->item); 

     inorder(h->r); 
    } 
     return; 

} 

Любые рекомендации приветствуются.

+0

Функция 'inorder' возвращает число, указывающее количество оставшихся узлов, затем передавайте число как параметр' inorder'. – nhahtdh

ответ

0

Попробуйте это - нужно работать только на x количество посещенных узлов (где количество посещенных узлов - это узлы, которые являются кандидатами на печать);

int inorder(node h, int x) 
{ 

    if (h != NULL && x > 0) 
    { 
     x = inorder(h->l, x); 

     if (x > 0) { 
      printf(" %d\n",h->item); 
      x--; 
     } 
     if (h->r && x > 0) 
      x = inorder(h->r, x); 
    } 
     return x; 

} 

[EDIT: Этот код был скорректирован @nhahtdh после некоторого обсуждения определения узлов посещаемого и декремента значения х. Рабочий тестовый код можно увидеть here.

+0

x это элемент, который он хочет посетить, а не в порядке посещения глубины, я думаю, – MYMNeo

+0

Я думаю, что он хочет посетить x количество узлов, если я не ошибаюсь. – nommyravian

+0

Я думаю, что вы уменьшаете слишком много. Вы должны только уменьшать один раз, но, похоже, вы уменьшаете x дважды на вызов функции (игнорируя рекурсивный вызов). – nhahtdh

1

Предполагая, что «количество посещений» - это количество узлов, которые вы хотите распечатать из обходного порядка. Одним из решений является то, что функция inorder возвращает количество оставшихся узлов для печати и проверяет их при прохождении дерева.

int inorder(node h, int x) 
{ 
    // I mimic your current code. The code is indeed shorter, but it will 
    // do extra recursion, compared to the other approach of checking 
    // for the subtree and value of x before the recursive call. 
    if (h != NULL && x > 0) 
    { 
     x = inorder(h->l, x); 

     if (x > 0) { 
      printf(" %d\n",h->item); 
      x--; 
     } 

     x = inorder(h->r, x); 
    } 

    return x; 
} 

Другой небольшое изменение в реализации является передать указатель на переменную, содержащую x, и использовать его для обновления счетчика. Функция не должна возвращать что-либо, если она написана таким образом.

void inorder(node h, int *x) 
{ 
    // I mimic your current code. The code is indeed shorter, but it will 
    // do extra recursion, compared to the other approach of checking 
    // for the subtree and value of x before the recursive call. 
    if (h == NULL && *x > 0) 
    { 
     inorder(h->l, x); 

     if (*x > 0) { 
      printf(" %d\n",h->item); 
      (*x)--; 
     } 

     inorder(h->r, x); 
    } 
} 
Смежные вопросы