2017-08-08 23 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によって1回呼び出されます。

関連する問題