DFSを使用して1つの問題を解決しようとしています: バイナリツリー(BSTではありません)とターゲットを指定すると、指定したターゲットに最も近いtreenode値を見つけます。 この問題を解決する方法は複数ありますが、単純なDFSを実行して各ノードをトラバースし、途中でminを更新しようとしています。そして、すべてのノードが訪問された後、minを返します。再帰関数で変数を更新できません
私が今直面している問題は、closestValue()関数で返される分が常に初期のroot.valであることです。再帰呼び出しスタックを引き出しました。すべてが期待どおりに動作します。常に更新されますが、closestValue()関数に戻ると、minは常に初期のroot.val値に設定されますが、私はこれに戸惑います。
ご協力いただきありがとうございます。
public int closetValue(TreeNode root, double target){
return dfs(root, target, root.val);
}
private int dfs(TreeNode root, double target, int minVal){
if(root == null) return minVal;
if(Math.abs(root.val - target) < Math.abs(minVal - target)){
minVal = root.val;
}
minVal = dfs(root.left, target, minVal);
minVal = dfs(root.right, target, minVal);
return minVal;
}
私は価値があるためだった戻ってトラブルを持っていた理由を:ジョン・コールマンが提案されているよう
public int closestValue(TreeNode root, double target) {
Integer min = root.val;
Double minDelta = Double.MAX_VALUE;
dfs(root, min, minDelta, target);
return min;
}
private void dfs(TreeNode root, Integer min, Double minDelta, double target){
if(root == null) return;
if(minDelta > Math.abs(root.val - target)){
minDelta = Math.abs(root.val - target);
min = root.val;
}
dfs(root.left, min, minDelta, target);
dfs(root.right, min, minDelta, target);
}
'closestValue'関数は返す前に' min'を変更することはありません。あなたは値渡しがどのように働くかについて基本的な誤解があるようです。何かを返すように 'dfs'を書き直してみませんか? –
ありがとうジョン!私は何かを誤解しなければならないことを知っている。しかし、私は他の再帰関数が変数を変更できる理由を理解していない、私は下の別の再帰関数を貼り付けます。また、dfs()関数で最小値を返そうとしましたが、うまくいきませんでした。 – FisherCoder
Javaは常に値渡しです。渡される値は、可変オブジェクトへの参照であり、可変オブジェクトは、突然変異している可能性があります。しかし、 'int'のようなプリミティブな値は、関数呼び出し、再帰的または他の方法で変更することはできません。 –