2013-12-10 3 views
1

Вопрос можно суммировать по адресу: Как правильно обрабатывать инициализацию указателей в рекурсивной функции?Выделите указатели узлов в дереве в C++

Я думаю, что этот вопрос довольно прост, но я до сих пор не могу понять, как его решить.

У меня есть древовидная структура, определенная следующим образом:

class SplitNode{ 

public: 
    Data d; 
    SplitNodeParam snp; 
    SplitNode* left_; //will stay uninitialized 
    SplitNode* right_;} 

Я построить дерево из его корня с помощью следующей рекурсивной функции:

void buildTree(SplitNode* n){ 
    findBestSplit(n); 
    buildTree(n->left); 
    buildTree(n->right); //forget that the tree growing doesnt stop 
} 

я беру узел и свои данные и сделать разделение данных в зависимости от функции. И я хотел бы назначить текущий узел левой и правой дочерним элементам следующим образом.

void findBestSplit(SplitNode* n){ 

    //Do stuff with data and parameters 

    SplitNodeParam left_parameter(/*Some parameters*/); 
    *(n->left)=SplitNode(left_parameter); 

    SplitNodeParam right_parameter(/*Some parameters*/); 
    *(n->right)=SplitNode(right_parameter); 

} 

Большая проблема, кажется, что я хочу, чтобы назначить нулевой указатель SplitNode на локальную переменную и надеемся получить его позже, который практически невозможно.

Я видел несколько примеров в C, чтобы сделать что-то подобное (с таНосом), но я хотел бы иметь, как это будет сделано аккуратно в C++

Заранее спасибо.

+1

Я думаю, вы хотите что-то большее, как 'n-> left = new SplitNode (left_parameter)'. Теперь у вас есть копирование временного ключа в nullupr. –

ответ

0

Вы не хотите назначать n->left локальной переменной, как вы здесь делаете. Я предполагаю, что вы не выделили память для этих разделенных узлов в этот момент в findBestSplit.

Вместо этого вам нужно будет управлять памятью, произнеся n->left = new SplitNode(left_parameter), а затем очистив выделенную память позже соответствующим вызовом delete. То же самое касается n->right.

Возможно, вы получите функцию deleteTree, которая принимает корневой узел. Этот корневой узел будет рекурсивно вызывать deleteTree на своих дочерних элементах, пока он не попадет на листовой узел. На листовом узле узел удалит себя и затем вернется. Таким образом, вы не теряете следы всех листьев деревьев, и вы можете правильно освободить всю память.

+0

Отлично, это именно то, что мне нужно. благодаря – AdMor

Смежные вопросы