Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2012, 22:13   #1
DizzzI
Новичок
Джуниор
 
Регистрация: 12.03.2011
Сообщений: 1
По умолчанию N-арное дерево.

Привет всем. Пишу 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;
}
DizzzI вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дерево Dizelektwo Общие вопросы C/C++ 8 09.07.2012 10:44
дерево... Лиляля Помощь студентам 2 28.05.2012 20:09
Дерево Igemon93 Общие вопросы C/C++ 0 14.04.2012 18:56
N-арное дерево Xenogig Общие вопросы C/C++ 1 29.05.2011 19:55
дерево С# Natok Помощь студентам 0 14.09.2009 23:42