2017-08-08 43 views
0

我正在实现树节点功能。但我被卡在删除节点。 它一直给这个错误。我已经用TreeNode *函数尝试了这一点,它完全可以工作,但是当我试图将其更改为void函数时,它会一直给出错误。C++错误(从不兼容类型'void'分配给TreeNode *)

我想把它变成一个void函数。

void Tree::deleteFrom(TreeNode* startintPoint, int value) 



//from example in class, deleting a node 


if (startintPoint == nullptr) 
{ 
    return; 
} 
else if (startintPoint->left != nullptr && value < startintPoint->value) 
{ 
    startintPoint->left = deleteFrom(startintPoint->left, value); 
} 
else if (startintPoint->right != nullptr && value > startintPoint->value) 
{ 
    startintPoint->right = deleteFrom(startintPoint->right, value); 
} 
else 
{ 
    if (startintPoint->left == nullptr && startintPoint->right == nullptr) 
    { 
     delete startintPoint; 
     startintPoint = nullptr; 
    } 
    else if (startintPoint->left == nullptr) 
    { 
     TreeNode* temp = startintPoint; 
     startintPoint = startintPoint->right; 
     delete temp; 
    } 
    else if (startintPoint->right == nullptr) 
    { 
     TreeNode* temp = startintPoint; 
     startintPoint = startintPoint->left; 
     delete temp; 
    } 
    else 
    { 
     TreeNode* temp = findMinValue(startintPoint->right); 
     startintPoint->value = temp->value; 
     startintPoint->right = deleteFrom(startintPoint->right, temp->value); 
    } 


    } 

    return startintPoint; 
} 
+0

您可以像'startintPoint-> left = deleteFrom(...)一样分配,但是'deleteFrom'的返回值类型为'void',即'void deleteFrom(...)'。所以它不会返回任何可以分配的值。 –

+0

此函数底部的'return startintPoint'应该直接说明'void'是这个函数的错误返回类型。 – WhozCraig

回答

0

由于函数的返回类型是void,编译器不象线

startintPoint->left = deleteFrom(startintPoint->left, value); 

startintPoint->right = deleteFrom(startintPoint->right, value); 

那些语句的RHS是void型的,而LHS类型为TreeNode*

您需要将函数的返回类型更改为TreeNode*。这将允许您使用线条。

然后确保从函数返回正确的指针,这似乎是您已经在做的。

0

您指定为startintPoint->left = deleteFrom(...),但deleteFrom的返回值类型为void,即void deleteFrom(...)。所以它不会返回任何可以分配的值。

您可以将void Tree::deleteFrom(TreeNode* startintPoint, int value)更改为TreeNode* Tree::deleteFrom(TreeNode* startintPoint, int value)

如果你想离开deleteFrom,因为它是,你可以引入额外的(可能是受保护或私有函数)一样TreeNode* Tree::deleteFromRecursive(TreeNode* startintPoint, int value)这递归调用本身和由deleteFrom调用一次。

相关问题