在二叉树中获取从根到给定值的节点的距离:算法正确性

时间:2014-03-23 01:02:56

标签: algorithm language-agnostic binary-tree

这是我的代码

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

对于上述方法的正确性或任何优化的任何反馈,我将不胜感激。

2 个答案:

答案 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一直提升到子树的根,而不会更改它,保持信息"价值不在这里"完整。如果在至少一个子树中找到该值,那么leftright都不是-1,这样检查就会失败并且return最后的陈述将给出预期的价值。

答案 1 :(得分:0)

int?表示变体类型intnull。在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等特殊值。我个人倾向于使用可空/可选值,因为它看起来更清晰,但这并不是解决这个问题的必要条件。