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

Ваш аккаунт

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

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

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

Вывод бинарного дерева на консоль

10K
18 мая 2008 года
Shalfey
47 / / 10.03.2007
Подскажите пожалуйста, как это реализовать.
11
18 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Shalfey
Подскажите пожалуйста, как это реализовать.



на С++ вывод в консоль ф-я cout
на C# Console.Write(...)

9.4K
18 мая 2008 года
AIGrifon
165 / / 13.11.2007
Идея следующая: организовывается рекурсивная функция, параметрами которой является указатель и строка для вывода на консоль.

Сначала в нее подается корень и пустая строка.
Если это лист, то нужно вывести его значение, предварительно вывев строку отступа, передаваемую в функцию.
Иначе вызывается эта же функция для левого поддерева и в строку ей дописывается один пробел,
затем печатается текущая вершина с использованием текущей строки отступов,
затем функция вызывается для правого поддерева и в строку ей снова дописывается один пробел.

Получится дерево, уложенное на бок.
11
18 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
здесь, как пробежаться по дереву рекурсией
10K
19 мая 2008 года
Shalfey
47 / / 10.03.2007
Совсем не понимаю последовательности вызовов в рекурсии. Поэтому пишу вот такую кашу:
Код:
template <class T> void TBinTree<T>::StartOut(void){
    if(Root == NULL){
        cout<<"Nothing to print!\n"; cin.get();
        return;
    }
    Out(Root, "");
}
template <class T> void TBinTree<T>::Out(TTreeNode<T> *p, string str){
    if((p->Left == NULL)&&(p->Right == NULL)){
        cout<<str<<p->Data<<endl;
    }else{
        if(p->Left != NULL){
            str += " ";
            Out(p->Left, str);
        }
        cout<<str<<p->Data;
        if(p->Right != NULL){
            str += " ";
            Out(p->Right, str);
        }
    }
}

Без конкретного кода не разберусь.
9.4K
19 мая 2008 года
AIGrifon
165 / / 13.11.2007
Цитата: Shalfey
Совсем не понимаю последовательности вызовов в рекурсии. :
Без конкретного кода не разберусь.



Все достаточно просто:

[highlight=cpp]
template <class T>
void TBinTree<T>::StartOut(void)
{
if(Root)
{
Out(Root, "");
}
else
{
cout << "Nothing to print!\n";
cin.get();
}
}

template <class T>
void TBinTree<T>::Out(TTreeNode<T> *p, string str)
{
//Левое поддерево
if (p->Left)
{
Out(p->Left,str + " ");
}
//Корень
cout << str << p->Data << endl;
//Правое поддерево
if (p->Right)
{
Out(p->Right,str + " ");
}
}
[/highlight]

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