まあ、Javaは値言語によってパスがそれを呼び出したメソッドのcount
の値を変更しない1回のメソッド呼び出しでcount
の値を変更すること、です。
k
が5
とcount
4
であるとき、あなたが呼び出している、再帰中のある時点で仮定します
int sum = findSumRec(root.left, 5, 4);
は、この呼び出しは5
に、渡されたcount
を増加させ、いくつかのsum
を返すと仮定します。
今、あなたは戻ってfindSumRec(root.left, 5, 4)
と呼ばれ、あなたがチェックする方法にある。最近返さ再帰呼び出しは、呼び出し側がまだcount
を見て、あなたが行われるべきことを意味する、5
までcount
を持っていても
if(4 >= 5)
return sum;
4
(これは同じcount
変数ではないため)、したがって、ツリーのすべてのノードを参照してそれらのすべてを合計するまで、ツリーのトラバーサルは継続されます。
count
を変更するには、いくつかの可変インスタンスを使用する必要があります。私はちょうど私の修正案であなたのコードをテストし、それが動作します:
public int findSum(Node root, int k){
int[] count = {0};
return findSumRec(root, k, count);
}
と
private int findSumRec(Node root, int k, int[] count) {
...
change each count to count[0]
...
}
EDIT:
はたとえば、1つの要素を持つ配列を使用することができます。
public int findSum(Node root, int k) {
int[] count = {0};
return findSumRec(root, k, count);
}
private int findSumRec(Node root, int k, int[] count) {
if(root == null)
return 0;
if(count[0] > k)
return 0;
int sum = findSumRec(root.left, k, count);
if(count[0] >= k)
return sum;
sum += root.val;
count[0]++;
if(count[0] >= k)
return sum;
return sum + findSumRec(root.right, k, count);
}
点は、すべての再帰的方法はcount
変数の値を共有し、それを変更することができなければならないfindSumRec
にコールすることです。 count
がメソッドに渡されたプリミティブ変数である場合、各メソッドはその変数の異なるコピーを取得するため、これは不可能です。
アレイの使用は1つのオプションです。別のオプションは、引数として渡す代わりに、メソッドを含むクラスのメンバ変数を使用することです。このようにしても、それはまだint
です。 count_k_smallest_sum -
これは、トラバースを唯一のelemsに制限するために、インオーダートラバーサルのコードを再利用しました –
予想される出力は何ですか?あなたは代わりにどんな出力を得ていますか? – cyroxis
あなたのコードはツリー内のすべての数字を追加しています。最小であるかどうかを確認するロジックは –