Привет всем. Пишу N-арное дерево, т.е. дерево у которого кол-во элементов на каждом уровне равно N^(k-1), где k - номер уровня и у одного узла не может быть больше N элементов.
Проблема у меня вот в чем, первые два элемента добавляются нормально (первый на первый уровень, второй на второй соответственно), а остальные заместо 2-го уровня добавляются на 1-й. Вот какой алгоритм добавления в это дерево я хотел сделать:
1) узнаем количество уровней у дерева, процедура GetHeight();
2) считаем максимальное возможное кол-во эл-в на уровне: pow(n, k-1);
3) считаем кол-во эл-в на уровне, процедура GetNodesOnLevel(k), k - номер уровня;
4) сравниваем между собой, если 2) > 3), если истинно, то добавляем в текущий уровень, иначе создаем новый.
Жду ответов) Если у кого нить, есть готовая прога скиньте))
Вот код:
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
template <class T>
class Tree
{
struct Node
{
T item; //полезная инца
Node* son; // указатель на дочерний элемент и братьев
Node* brother;
Node(T i, Node* s = NULL, Node* b = NULL)
{
item = i;
son = s;
brother = b;
}
};
//указатель на корень
Node *root;
public:
//конструктор пустого дерева
Tree()
{
root = NULL;
}
//рукурсивное удаление дерева из памяти
~Tree()
{
DeleteSubtree(root);
}
//высота дерева
int GetHeight()
{
return GetHeight(root);
}
//кол-во эл-в на уровне
int GetNodesOnLevel(int level)
{
return GetNodesOnLevel(root, level);
}
//добавление эл-та
void Add(const T & elem)
{
Add(root,elem);
}
private:
void Add(Node*&node, const T &elem);
void DeleteSubtree(Node *node);
int GetHeight(Node *node);
int GetNodesOnLevel(Node *node, int level);
};
template <class T>
//проверяет не пустой ли узел(узел мб пустой, если это последний элемент в дереве),
//если нет то удаляем дочерние эл-ты и ьратьев
void Tree<T>::DeleteSubtree(Node *node)
{
if (node)
{
DeleteSubtree(node->son);
DeleteSubtree(node->brother);
delete node;
}
}
template <class T>
int Tree<T>::GetHeight(Node *node)
{
if (node == NULL)
return 0;
int max = 0;
for (Node *current = node->son; current; current = current->brother)
{
int curHeight = GetHeight(current);
if (curHeight > max)
max = curHeight;
}
return max +1;
}
template <class T>
int Tree<T>::GetNodesOnLevel(Node *node, int level)
{
if (node == NULL)
return 0;
if (level <= 0)
return 0;
return GetNodesOnLevel(node->son, level-1) + (level ==1) + GetNodesOnLevel(node->brother, level);
}
int pow1(int val, unsigned int n)
{
int r = 1; // Для степени = 0 результат будет 1
if (val != 0) // Если основание = 0, то цикл не выполняется
for (; n-- > 0;)
r *= val;
else r = 0;
return r;
}
template <class T>
void Tree<T>::Add(Node *&node, const T &item)
{
//если дошли до последнего эл-та, то создаем новый
if (node == NULL)
{
node = new Node(item);
}
else
{
int n = 3;
int k = GetHeight(); // кол-во уровней
cout << "k: " << k << endl;
int p = pow1(n,k-1); // максимальное кол-во эл-в на уровне
cout << "p: " << p << endl;
int ss = GetNodesOnLevel(k);//кол-во эл-в на уровне
cout << "ss: " << ss << "\n" << endl;
if (ss < p)
{
//добавляем на тот же уровень
Add(node->brother, item);
}
else
{
Add(node->son, item);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Tree<int> tree1;
tree1.Add(12);
tree1.Add(5);
tree1.Add(3);
tree1.Add(10);
tree1.Add(7);
tree1.Add(11);
cout << "Tree heigh: " << tree1.GetHeight() << endl
<< "There are 1 level: " << tree1.GetNodesOnLevel(1) << " !" << endl
<< "There are 2 level: " << tree1.GetNodesOnLevel(2) << " !" << endl
<< "There are 3 level: " << tree1.GetNodesOnLevel(3) << " !" << endl;
getch();
return 0;
}