Дано дерево поиска, ключи которого – целые числа (положительные и отрицательные). Определить К-е «–»-е число, следующее за «+»-м числом при прямом просмотре дерева (TLR). У меня программа похоже вообще неправильно работает. Подскажите ошибки, пожалуйста. Помогите преобразовать эту программу в классы. | Код | #include <iostream.h> #include <iomanip.h> #include <stdlib.h> #include <conio.h>
struct Node // узел дерева { int key; // поле ключа узла Node *l; // поле ссылки на левую (left) ветвь из данного узла Node *r; // ... на правую (right) ветвь ... }; typedef Node* NodePtr; // тип - указатель на узел
void BalanceTree(NodePtr& t, int n); // cтроит сбалансированное дерево (СД) из n элементов
void TreeOut( NodePtr t, int level=1 ); // выводит на экран дерево t от корня слева направо, level - номер // уровня дерева, обращение: OutTree( t )
void LevelOut(NodePtr t, int m); // выводит на экран // Massiv
void TreeDelete(NodePtr& t); // oсвобождает память, t <- NULL
void main() { NodePtr t, tl; int n, m; clrscr(); t = NULL; cout <<"LR8 Сбалансированное дерево."; cout <<"\nВведите число элементов n и элементы:\n"; cin >>n;
BalanceTree(t, n); TreeOut( t ); // исходное дерево
cout <<"\nPlease, writeln the number of last Level: "; cin >>m; cout <<"\nMASSIV: "; LevelOut(t, m);
TreeDelete(t); getch(); }
void BalanceTree(NodePtr& t, int n) // cтроит { int k, nl, nr; // сбалансированное дерево (СД) из n элементов
if (n == 0) t = NULL; else { nl = n / 2; // число узлов в левой ветви nr = n-nl-1; // то же в правой ветви // построения СД: cin >>k; // 1. Элемент "k" - корень ветви t = new Node; t->key = k; BalanceTree(t->l, nl); // 2. Построить левую ветвь с nl узлами BalanceTree(t->r, nr); // 3. Построить правую ветвь с nr узлами } }
void TreeOut( NodePtr t, int level ) // вывод дерева t на экран { int tab = 5; // интервал табуляции между уровнями дерева
if (t == NULL) cout <<"Дерево пусто ! \n"; else { if (t->r != NULL) TreeOut(t->r, level+1); // pекурсивный спуск // до последнего элемента по правой ветви cout <<setw(tab*level*2) <<t->key <<endl; if (t->l != NULL) TreeOut(t->l, level+1); } }
void LevelOut(NodePtr t, int m) // выводит на экран Massiv
{ if (t == NULL) cout <<"Дерево пусто ! \n"; else { m = m-1; if (m>0 && t->l != NULL) LevelOut(t->l, m); if (m == 0) cout <<t->key <<' '; if (m>0 && t->r != NULL) LevelOut(t->r, m); } } void TreeDelete(NodePtr& t) // освобождает память, t <- NULL { if ( t != NULL ) { TreeDelete(t->r); TreeDelete(t->l); delete t; t = NULL; } }
|
|