这是我的代码
public int getDist(Node root, int value)
{
if (root == null && value !=0)
return -1;//
if(root.value == value)// we have a match
return 0;
if(root.getLeft()!=null)
int left =1+ getDist(root.getLeft(),value);
int right = 1+getDist(root.getRight(),value);
if(left ==-1 && right== -1)
return -1;//not found
return Math.max(left,right);
}
对于上述方法的正确性或任何优化的任何反馈,我将不胜感激。
答案 0 :(得分:3)
目前,您的代码无法按预期工作。另一方面考虑这个:
public int getDist(Node root, int value) {
// value is never in an empty subtree
if (root == null)
return -1;
// found value, distance from root is 0
if(root.value == value)
return 0;
// find distance from root of left subtree
int left = getDist(root.getLeft(),value);
// find distance from root of right subtree
int right = getDist(root.getRight(),value);
// value not found in either subtree
if(left == -1 && right == -1)
return -1;
// if the value was found,
// return the distance from the root of the subtree + 1
return 1 + Math.max(left,right);
}
我所做的更改是删除一些多余的支票,并在检查"值之后移动+1
,而不是在任何子树"中。它具有的效果如下:如果递归发现该值不在子树中,那么return
语句将会将值-1
一直提升到子树的根,而不会更改它,保持信息"价值不在这里"完整。如果在至少一个子树中找到该值,那么left
和right
都不是-1
,这样检查就会失败并且return
最后的陈述将给出预期的价值。
答案 1 :(得分:0)
让int?
表示变体类型int
或null
。在C#中,这是Nullable<int>
,在C ++ 11中,这是std::optional<int>
等等。
然后以下代码将起作用。它只是对您的代码稍作修改,关键区别在于使用min
代替max
。
int? dist(Node root, int value)
{
if (root == null) return null;
if (root.value == value) return 0;
int? left = dist(root.left, value);
int? right = dist(root.right, value);
if (left == null && right == null) return null;
if (left != null && right != null) return 1 + min(left, right);
if (left != null) return 1 + left;
return 1 + right;
}
如果需要,您可以使用int
并将null
的相应匹配项替换为-1
等特殊值。我个人倾向于使用可空/可选值,因为它看起来更清晰,但这并不是解决这个问题的必要条件。