1

現在、この関数を呼び出すと、すべての子ノードが削除され、渡されたノードのメモリが解放されますが、ノードはまだ親にリンクされており、ゴミが含まれています。
渡したノードの親ノード (左または右の子) を等しく設定できるようにする必要があるNULLため、ツリーをトラバースするときにプログラムがクラッシュしません。

ここに私がすでに持っているコードがあります:

void emptySubtree(BinaryNode* node) {
    if (node == NULL)
        return;

    emptySubtree(node->left);
    emptySubtree(node->right);
    free(node);
}

これが私の関数呼び出しです:emptySubtree(tree->root->left)

4

2 に答える 2

1
void emptySubtree(BinaryNode **pNode)
{
    BinaryNode *node = *pNode;

    if (node == NULL)
        return;

    emptySubtree(&node->left);
    emptySubtree(&node->right);
    free(node);
    *pNode = NULL;
}

で電話するemptySubtree(&tree->root->left);

またはさらに単純です:

// This is your function, renamed.
void emptySubtreeHelper(BinaryNode* node) {
    if (node == NULL)
        return;

    emptySubtreeHelper(node->left);
    emptySubtreeHelper(node->right);
    free(node);
}

void emptySubtree(BinaryNode **pNode) {
    emptySubtreeHelper(*pNode);
    *pNode = NULL;
}

もう一度、emptySubtree(&tree->root->left);

于 2014-11-06T07:23:20.750 に答える