无法在递归函数中更新一个变量

时间:2016-06-25 17:05:57

标签: java recursion

我正在尝试使用DFS解决一个问题: 给定二叉树(不是BST!)和目标,找到最接近给定目标的treenode值。 我知道有多种方法可以解决这个问题,但我只是想尝试一个简单的DFS遍历每个节点并沿途更新min,然后在访问完所有节点后返回min。

我现在遇到的问题是我在nearestValue()函数中返回的min总是初始的root.val,我已经绘制了递归调用stack,它都按预期工作,min是总是更新,但当它返回到nearestValue()函数时,min总是被设置回初始的root.val值,我对此感到困惑。

非常感谢任何帮助!

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);
}

1 个答案:

答案 0 :(得分:0)

好吧,我想,正如John Coleman建议的那样,让dfs()函数返回一个值是一个好方法:

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;
}

我无法返回值的原因是因为我认为在从左右子树获得minVal之后我需要进行一些处理:

int leftMinVal = dfs(root.left, target, minVal);
int rightMinVal = dfs(root.left, target, minVal);
return Math.min(leftMinVal, rightMinVal);

这当然给了我错误的答案。 感谢您的帮助。