2017-08-08 109 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調用一次。

相關問題