Найти предков данного узла в n-арном дереве c ++ - PullRequest
0 голосов
/ 31 января 2019

Учитывая большое n-арное дерево, мне нужно создать рекурсивную функцию, которая печатает всех предков листа, например, где n-арная структура дерева задается как

 typedef struct sNaryNode
 {
    int *data;
    int nchild;
    struct sNaryNode **child;
 } NaryNode;

ВотЯ использовал функцию, но это дает неправильный ответ:

bool printAncestors(NaryNode *root, int *data) 
{ 
  int i=0;

   if (root == NULL) 
   return false; 

   if (root->data == data) 
   return true; 

   do
   {
      auto b=printAncestors(root->child[i], data);
      if(b)
      {   
          cout<<*root->data<<" ";
          return true;
      }
      else
          i++;
   }
   while(i<root->nchild);
}

1 Ответ

0 голосов
/ 31 января 2019

В конце вы пропускаете возвращаемое значение, и вы можете войти в цикл и получить доступ к root->child[i], даже если root->nchild равно нулю.
Оба эти параметра вызовут неопределенное поведение.

Я бы написал это с помощью цикла for:

bool printAncestors(const NaryNode *root, const int *data) 
{ 
    if (root == nullptr) 
        return false; 

    if (root->data == data) 
        return true;

    for (int i = 0; i < root->nchild; i++)
    {
        if (printAncestors(root->child[i], data))
        {   
            cout << *root->data << " ";
            return true;
        }
    }
    return false;
}
...