K-арное дерево с реализацией массива в C - PullRequest
0 голосов
/ 27 апреля 2020

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

  1. Это моя структура данных

    typedef char infotype;
    typedef int letak;
    
    typedef struct {
      infotype info;
      letak parent, firstson, nextsibling;
    } node;
    
    typedef node tree;
    
  2. Вот как я инициализирую каждый узел

      void initNode(tree T[], int k, int i)
      {
        char info;
    
      printf("Input the node name : ");
      scanf(" %c", &info);
      createNode(T, k, i, info);
    }
    
    void createNode(tree T[], int k, int i, char value)
    {
      int j;
    
      if(i == 0)
      {
        T[i].info = value;
        T[i].firstson = i+1;
      }
      else
      {
        T[i].info = value;
        T[i].parent = (i-1) / k;
        T[i].firstson = (i * k) + 1;
    
        if (i % k != 0)
        {
            T[i].nextsibling = i+1;
        }
    
        else
        {
            T[i].nextsibling = 0;
        }
      }
    }
    
  3. и вот как я пытаюсь выполнить обход в порядке

    void InOrder(tree T[], int maksimum_array, int maksimum_anak)
    {
      bool Resmi = true;
    
      int i = 0;
    
      while(i >= 0)
      {
        if(T[i].firstson < maksimum_array - 1 && Resmi == true)
        {
            i = T[i].firstson;
        }
        else 
        {
            if(Resmi == true)
            {
                printf("%c ", T[i].info);
            }
    
            if(i = T[T[i].parent].firstson)
            {
                printf("%c ", T[T[i].parent].info);
            }
    
            if(T[i].nextsibling < maksimum_array - 1 && T[i].nextsibling != 0)
            {
                i = T[i].nextsibling;
                Resmi = true;
            }
            else
            {
                i = T[i].parent;
                Resmi = false;
            }   
         }
       }
     }
    
  4. И это мой основной драйвер:

     int main()
     {
       tree pohon[1000];
       int maksimum;
       int maksimum_anak;
       int level;
       int i = 0;
       int count = 0;
       char cari;
    
       printf("Enter array maximum amount : ");
       scanf("%d", &maksimum);
    
       printf("\nEnter maximum child of each node : ");
       scanf("%d", &maksimum_anak);
    
       createTree(pohon);
    
       for (i = 0; i < maksimum ; i++)
       {
          initNode(pohon, maksimum_anak, i);
       }
    
       for (i = 0; i < maksimum; i++)
       {
          printTree(pohon, i, maksimum, maksimum_anak);
       }    
    
       printf("In Order Traversal : ");
       InOrder(pohon, maksimum, maksimum_anak); 
    }
    

Я пробовал другие алгоритмы обхода по порядку, например, с использованием рекурсии. Но так как я испортил структуру, эти алгоритмы просто не работали. Спасибо раньше.

1 Ответ

0 голосов
/ 27 апреля 2020
    if(i = T[T[i].parent].firstson)

Должно быть

    if(i == T[T[i].parent].firstson)

Первое присваивает i, второе сравнивает его.

...