Я пытаюсь создать максимальную кучу в VC ++, используя Visual Studio 2008 v9.0.30729.1 SP.
В дереве каждый узел выглядит так:
typedef struct node{
struct data_t *data;
struct node_t *left;
struct node_t *right;
}node_t;
Логика создания одного узла выглядит следующим образом:
node_t* createNode(int id, int pID, float probability)
{
node_t *temp = (node_t *)malloc(sizeof(node_t));
data_t *data = (data_t *)malloc(sizeof(data_t));
data->id = id;
data->pID = pID;
data->probability = probability;
temp->data = data;
temp->left = 0;
temp->right = 0;
return temp;
}
Мне удалось создать и вставить элементы в дерево (логика вставки работает нормально). Я застрял в логике удаления узла (если быть точным, листа) из этого дерева.
Я пробовал четыре разных подхода к одному и тому же:
node_t* deleteLeaf(node_t* heap)
{
node_t* leaf;
if((heap->left==0) && (heap->right==0))
{
//heap = 0; //APROACH 1
//heap->data = 0; //APROACH 2
return heap;
}
else if((heap->left!=0) && (heap->right==0))
{
leaf = deleteLeaf(heap->left);
}
else
{
leaf = deleteLeaf(heap->right);
}
//leaf = 0; //APROACH 3
//free(leaf); //APROACH 4
return leaf;
}
(Раскомментируйте ПОДХОД 1/2/3/4 для желаемого эффекта).
Кажется, ничего из этого не работает. Мне нужно присвоить нулевое / нулевое значение левому / правому указателю предыдущего узла.
Как заставить это работать? Пожалуйста помоги.
malloc
вместоnew
в программе на C ++? Также покажитеdeleteLeaf
. Кроме того, как правило, сначала нарисуйте операции на бумаге. Если вы пытаетесь выяснить, как удалить узел, написав код, не делайте этого. Сначала нарисуйте действия на бумаге, чтобы увидеть, что нужно сделать, затем примените то, что вы сделали на бумаге, к коду. - person PaulMcKenzie   schedule 04.09.2014free
. Итак, в вашей реализации есть утечка памяти. Кроме того, вы все еще используете «C», поскольку в опубликованном вами коде нет фактического использования C ++. - person PaulMcKenzie   schedule 04.09.2014