Реализовать двоичное дерево с использованием массива

#c #arrays #tree #binary-tree #abstract-data-type

#c #массивы #дерево #двоичное дерево #абстрактный тип данных

Вопрос:

в HW меня просят реализовать двоичное дерево с использованием указателей, а затем использовать реализацию массива bt. Проблема в том, что, хотя я знаю, как сделать и то, и другое, они должны использовать один и тот же основной файл . Под этим я подразумеваю, что тот же самый код, который я использовал для реализации указателей, должен использоваться реализацией массива. Это означает, что когда я ссылаюсь на insertTree (дерево, дерево-> слева), это должно работать и для массива.я полностью потерян. Мой узел:

     Typedef  struct BTNode{
     itemtype data;
      Struct BTNode * left;
     Struct BTNode * left;
    }BTNode;
  

Ответ №1:

В «стандартном» случае новая ячейка поддерживается результатом malloc, и когда она становится бесполезной, вы освобождаете ее

Использование массива может заключаться в том, чтобы иметь массив BTNode, и вместо того, чтобы вводить новую ячейку, вы получаете бесплатную запись в массиве. Поскольку ячейки могут быть получены / освобождены априори в любом порядке, вы также можете связать свободные ячейки, поэтому, когда ячейка освобождается, она повторно вводится в список свободных, связанный с массивом

Таким образом, только вызовы malloc / free должны быть изменены, чтобы иметь возможность использовать массив или нет


Примечание :

 Typedef  struct BTNode{
     itemtype data;
      Struct BTNode * left;
     Struct BTNode * left;
    }BTNode;
  

вы имеете в виду

 typedef  struct BTNode{
   itemtype data;
   struct BTNode * left;
   struct BTNode * right;
} BTNode;
  

Комментарии:

1. Итак, если я правильно понимаю, я просто использую Malloc для массива BTNodes . Каковы цели этого абстрактного типа? Я имею в виду, что это похоже на использование обычного абстрактного типа. В любом случае, спасибо за ответ, я обновлю сообщение для дальнейших вопросов.

2. нелегко использовать абстрактный тип в C, вероятно, лучший способ — использовать функции BTNode * allocBTnode() и void freeBTNodes(BTNode *) и предложить 2 их определения, одно с использованием malloc / free, а второе — array, выбор между 2 определениями может быть выполнен с помощью препроцессора ( #ifdef USEARRAY .. #else ... #endif ), чтобы выбрать то, которое будет использоваться во время компиляции