これは問題の説明です:
「ツリーと合計が与えられた場合、ルートからリーフへのパスがあり、パスに沿ったすべての値を合計すると、指定された合計に等しくなる場合は、trueを返します。」
私はそれを次のように実装しました:
int hasPathSum(Node* node, int sum) {
if(node == NULL)
return sum == 0;
int diff = sum - node->data;
if(diff < 0) return 0;
if(diff == 0)
return node->left == NULL && node->right == NULL ? 1 : 0;
if(diff < node->data)
return hasPathSum(node->left, diff);
else
return hasPathSum(node->right, diff);
}
の違いに応じて、1つのサブツリーのみをトラバースし、両方はトラバースしません(sum - node->data)
。
ただし、推奨されるソリューションでは、次のように両方のサブツリーをトラバースする必要がありました。
int hasPathSum(Node* node, int sum) {
// return true if we run out of tree and sum==0
if (node == NULL) {
return(sum == 0);
}
else {
// otherwise check both subtrees
int subSum = sum - node->data;
return(hasPathSum(node->left, subSum) ||
hasPathSum(node->right, subSum));
}
}
なぜ両方のサブツリーをトラバースする必要があるのかわかりませんか?
問題の原因は次のとおりです。問題7
編集:
ツリーがBSTであるという私の側の悪い仮定。その単なる二分木。
ただし、それがBSTの場合、実装に関するフィードバックを聞きたいですか?他の解決策よりも、私がやった方法でそれを行う方が良いのではないでしょうか?(このソリューションは任意の二分木用であるため、比較するのは少し不公平です)
ソリューションの編集:
私の提案した解決策の問題を説明するanatolygの応答をここで参照してください。anatolygに感謝します。