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);
}
}
}
Вывод бинарного дерева на консоль
Подскажите пожалуйста, как это реализовать.
Цитата: Shalfey
Подскажите пожалуйста, как это реализовать.
на С++ вывод в консоль ф-я cout
на C# Console.Write(...)
Сначала в нее подается корень и пустая строка.
Если это лист, то нужно вывести его значение, предварительно вывев строку отступа, передаваемую в функцию.
Иначе вызывается эта же функция для левого поддерева и в строку ей дописывается один пробел,
затем печатается текущая вершина с использованием текущей строки отступов,
затем функция вызывается для правого поддерева и в строку ей снова дописывается один пробел.
Получится дерево, уложенное на бок.
здесь, как пробежаться по дереву рекурсией
Совсем не понимаю последовательности вызовов в рекурсии. Поэтому пишу вот такую кашу:
Цитата: 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]