Задан массив целых чисел.
Создайте из них Бинарное Дерево Поиска. Если вставляемое значение равно текущей
вершине, то его следует вставлять в правое
поддерево.
Реализуйте метод PreOrder прямого обхода дерева. При
прямом обходе сначала посещается корень, потом левое поддерево, потом правое
поддерево.
Напишите код согласно следующего
интерфейса:
class TreeNode
{
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int
x) : val(x), left(NULL), right(NULL) {}
};
class Tree
{
public:
TreeNode *head;
Tree() : head(NULL) {};
void Insert(int val); // Вставка числа val в Бинарное Дерево Поиска
void PreOrder(void); // Вывести вершины дерева в порядке прямого обхода
};
Вы можете создавать
(использовать) по необходимости дополнительные методы.
Вход. Первая
строка содержит число n (1 ≤ n ≤ 100). Вторая строка содержит n целых чисел.
Выход. Создайте Бинарное Дерево Поиска
из входных данных. Выведите вершины дерева в порядке прямого обхода.
Пример входа
6
14 9 1 14 20 13
Пример выхода
14 9 1 13 14 20
РЕШЕНИЕ
дерево
Прямой
обход дерева (PreOrder): посещается корень, левое поддерево, правое поддерево;
Объявим рабочие структуры данных.
class TreeNode
{
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int
x) : val(x), left(NULL), right(NULL) {}
};
class Tree
{
public:
TreeNode *head;
Tree() : head(NULL) {};
void Insert(int val)
{
Insert(head,val);
}
void
Insert(TreeNode *&tree, int val)
{
if (tree ==
NULL)
{
tree = new
TreeNode(val);
return;
}
if (val
< tree->val)
Insert(tree->left,val);
else
Insert(tree->right,val);
}
void
PreOrder(void)
{
PreOrder(head);
printf("\n");
}
void
PreOrder(TreeNode *tree)
{
if (tree ==
NULL) return;
printf("%d
",tree->val);
PreOrder(tree->left);
PreOrder(tree->right);
}
};
Основная часть программы. Читаем входные данные, строим
дерево.
Tree a;
scanf("%d",&n);
for(i = 0; i < n; i++)
{
scanf("%d",&val);
a.Insert(val);
}
Выводим вершины дерева в порядке прямого
обхода.
a.PreOrder();