сжатие — построение дерева по предварительному заказу в Stack Overflow

Я работаю над назначением сжатия / распаковки. Я пытаюсь написать метод 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;
}
}
}

0

Решение

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

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

в

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);

в

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]