Re[3]: Реализация дерева средствами с++11
От: Stanislav V. Zudin Россия  
Дата: 16.04.16 12:57
Оценка:
Здравствуйте, _hum_, Вы писали:

SVZ>>Предлагаю "ход конём". Заменить указатели на индексы в массиве.


__>ну, тогда ж придется писать аналог менеждера кучи (чтоб искал свободное место, куда можно вставлять новые элементы, чтобы помечал удаленные как свободные места и т.п.). но еще чуть-чуть, и я психану и все же наверное так и сделаю, потому что тратить столько времени на реализацию обычного дерева — это уж слишком (а я уже третий день с этим вожусь)


Ох уж эта молодёжь...

Вот получение узла из "менеджера кучи":

// ==========================================================================
// Создать узел
dom::NODE dom::Document::makeNode(LPCTSTR name)
{
    dom::NODE nodeN = m_NodeFreeList;
    if ( nodeN < 0 )
    {
        nodeN = static_cast<dom::NODE>(m_InfoNode.size());
        m_InfoNode.push_back( NodeInfo() );
    }
    else
    {
        m_NodeFreeList = m_InfoNode[nodeN].next;
        m_InfoNode[nodeN] = NodeInfo();
    }

    NAMEREF nref = makeNodeName(name);
    m_InfoNode[nodeN].name = nref;

    return nodeN;
}


Удаленные узлы помещаются в односвязный список, голова которого хранится в m_NodeFreeList.
Хранить можно и плоский список, и целые поддеревья (только в makeNode придется этот факт учитывать), в общем пространство для маневра обширное.

Свой код не привожу, потому что у меня там хитрое владение именами узлов — не думаю, что тебе это пригодится.

По сложности — задачка на пару часов для студента 2 курса.
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.