Построение дерева из предварительного заказа в C++

Я работаю над заданием на сжатие/распаковку. Я пытаюсь написать метод C++ для построения дерева, используя следующий обход в предварительном порядке из заголовка моего сжатого файла: 001c1b01a01e1d 0 представляет собой внутренний узел, а 1 представляет собой лист. Каждый раз, когда я создаю узел, я устанавливаю код этого узла либо в 0, либо в 1, потому что я буду использовать другой метод для декодирования дерева, и он должен знать, как перемещаться по разным сторонам, используя эти коды. Всякий раз, когда я достигаю 1 в строке обхода предварительного заказа, я устанавливаю поле «символ» узла на следующий символ в строке предварительного заказа. Я не могу заставить его работать. Кто-нибудь может помочь? Вот мой код («bitsToRead» просто представляет длину строки предварительного заказа, поэтому метод знает, когда остановиться) Спасибо!

void HCTree::buildFromHeader(ifstream& in, HCNode* n, int codeToUse) {

   if( bitsToRead > 0) {
      char c = in.get();
      bitsToRead--;
      if(c == '0') {
         n = new HCNode(0, 0, 0, 0, 0, codeToUse);
         if(rootSet == 0) {
            root = n;
            rootSet = true;
         }
         HCNode* left;
         n->c0 = left;
         HCNode* right;
         n->c1 = right;
         buildFromHeader(in, left, 0);
         buildFromHeader(in, right, 1);
      }
      else { 
         byte symbol = in.get();
         n = new HCNode(0, symbol, 0, 0, 0, codeToUse);
         bitsToRead--;
         n->c0 = n->c1 = NULL;
      }
   }
}

person gcc    schedule 18.11.2013    source источник


Ответы (1)


Кажется, меняется

void HCTree::buildFromHeader(ifstream& in, HCNode* n, int codeToUse) {

to

void HCTree::buildFromHeader(ifstream& in, HCNode* &n, int codeToUse) {

сделает работу.

Плюс логика rootSet может быть опущена. Вы просто позвоните

buildFromHeader(in, root, codeToUse)

от звонящего.

ИЗМЕНИТЬ:

Я неправильно прочитал ваш код в первую очередь. n = new HCNode(0, symbol, 0, 0, 0, codeToUse); - это код, который заставил меня предложить использовать ссылку. Потому что здесь вы хотите изменить указатель, переданный от предка листа (вещи n->c0 = left и n->c1 = right). Чтобы все работало, в дополнение к изменению выше, измените

HCNode* left;
n->c0 = left;
HCNode* right;
n->c1 = right;
buildFromHeader(in, left, 0);
buildFromHeader(in, right, 1);

to

buildFromHeader(in, n->c0, 0);
buildFromHeader(in, n->c1, 0);

Это позволит вызываемому объекту прозрачно назначать значения указателям внутри struct с помощью ссылок.

person Xiangyan Sun    schedule 18.11.2013
comment
Хм, спасибо за помощь, но это не работает... Почему вы предложили перейти с HCNode* n на HCNode* &n ?? - person gcc; 18.11.2013
comment
Извините, но я неправильно прочитал часть вашего кода, ответ обновлен и надеюсь, что теперь он правильный. - person Xiangyan Sun; 18.11.2013
comment
Благодарю вас! Я наконец-то получаю результат! - person gcc; 18.11.2013