1

期待どおりに機能するこの再帰関数を作成しました。それは二分木を検証します。つまり、与えられた二分木が二分探索木であるかどうかをチェックし、正しい答えも与えます。

ただし、次のようなコンパイラ警告が表示されます。

Control may reach end of non-void function

このエラーが何を意味するのかはわかりboolます。関数は、関数の最後でフォールオフするだけでなく、を返す必要があります。それはを返すので、私はそれを克服する方法がわかりませんbool

繰り返しながら見落としていたかもしれないものを探してみたが、役に立たなかった。

bool isBSTRecursively(Node * root){
    if (!root) {
        return true;
    }else if (!root->getLeft() && !root->getRight()){
        return true;
    }else if(!root->getLeft()){
        if (root->getRight()->getData() > root->getData()) {
            return isBSTRecursively(root->getRight());
        }
    }else if (!root->getRight()){
        if (root->getLeft()->getData() < root->getData()) {
            return isBSTRecursively(root->getLeft());
        }
    }else{
        return (isBSTRecursively(root->getLeft()) && isBSTRecursively(root->getRight()));
    }
}
4

2 に答える 2

2

これらの部分で:

}else if(!root->getLeft()){
    if (root->getRight()->getData() > root->getData()) {
        return isBSTRecursively(root->getRight());
    }
}else if (!root->getRight()){
    if (root->getLeft()->getData() < root->getData()) {
        return isBSTRecursively(root->getLeft());
    }

ここでは、2つの特定のケースでのみ戻ることに注意してください。それは警告があなたに告げるものです、値を持つ明示的に含まれていないコードがとることができるパスがあるということreturnです。コードがこれを明示的に行わない場合に遭遇した場合、これは奇妙な問題につながる可能性がありますreturn

警告を消す最も簡単な方法return falseは、関数の最後にを追加することです。

于 2013-03-24T07:31:04.060 に答える
2

すべてのtrueオプションでtrueを返す関数を作成しましたが、falseを返すことはありません。

最後にfalseを返すと正しい結果になり、警告が修正されるようです。

于 2013-03-24T07:40:40.813 に答える