我正在尝试使用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);
}
答案 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);
这当然给了我错误的答案。 感谢您的帮助。