Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обход дерева Хаффмана C#

440
13 марта 2010 года
[FENIX]
83 / / 29.01.2007
Народ, помогите написать метод, который бы обходил дерево, и доходя до терминального узла (листа), распечатывал бы его, а промежуточные узлы не распечатывал. Мне в конечном итоге нужно заполнить таблицу, в каждой ячейке которой находилось бы значение поля узла.

Я метод написал, но он неправильно работает (язык C#):
Код:
public string LRK(Huffman_Node koren)
        {
            string code = "";
            if (koren != null)
            {
                code += LRK(koren.Left);
                code += LRK(koren.Right);
                code += koren.Code;
            }
                return code;
        }


И вызов:
Код:
int i = 0;
           

            Huffman_Node pointer = L1.First;// Это список из символов, и частотой вхождения символа в строке
            while (pointer != null && i < dataGridView1.RowCount)
            {
                dataGridView1.Rows.Cells[0].Value = pointer.Symbol;
                dataGridView1.Rows.Cells[1].Value = pointer.Weight;
                dataGridView1.Rows.Cells[2].Value = Tree.LRK(Tree.Root);
                pointer = pointer.Link;

                i++;
            }
9.7K
14 марта 2010 года
oltzowwa
105 / / 15.02.2007
А вы отладчиком пользовались, чтобы посмотреть, где программа не так работает?
440
15 марта 2010 года
[FENIX]
83 / / 29.01.2007
Конечно пользовался. Я отладить не могу метод, пока смог тольк его немного модифицировать:

Код:
public string RLK(Huffman_Node koren)
        {
            string code = "";
            if (koren != null)
            {
                if (koren.Right != null)
                    code += RLK(koren.Right) + " ";


                if (koren.Left != null)
                    code += RLK(koren.Left) + " ";

                if (koren.Left != null && koren.Right != null)
                    return code;

                code += koren.Code;

            }
            return code;
        }


Этот метод обходит все узлы, и возвращает полную трассу обхода всего дерева, а мне нужно, чтоб когда указатель доходил до листа, метод возвращал значение поля этого узла. (Дерево Хаффмана).
9.7K
15 марта 2010 года
oltzowwa
105 / / 15.02.2007
Цитата:
Я отладить не могу метод


Когда он сохраняет в code значения промежуточных узлов, момент этот не смогли обнаружить? Странно, но да ладно.

Но в новой модификации вы на верном пути:)

Попробуйте этот вариант:

Код:
public string LRK(Huffman_Node koren)
{
    string code = "";
    if (koren != null)
    {
        if ( koren.Left == null && koren.Right == null )
        {
            code = koren.Code;
        }
        else
        {
            code += LRK(koren.Left);
            code += LRK(koren.Right);
        }

    }
    return code;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог