我是否回答了这次采访挑战? (在C#中检查有效的二叉树)

时间:2015-11-19 06:52:09

标签: c# .net algorithm data-structures tree

我是C#的初学者。如果我正确地做了这个面试问题,请告诉我(面试结束了,所以不要以为你在帮我作弊或其他任何事情)。

提示是

  

编写一个函数来确定给定的二叉树是否不同   整数是一个有效的二叉搜索树。假设每个节点都包含   指向其左子节点的指针,指向其右子节点的指针和   整数,但不是指向其父级的指针。您可以使用任何语言   你喜欢。但是,如果你的语言已经有了库,你可能不会   使用这些库。

public class node
{
    node left { get; set; }
    node right { get; set; }
    int val;
}

(以上是我写的,是否更正了如何根据提示创建节点?因为nodeclass,我的leftrightnode s的引用,即内存地址的副本。对吗?)

bool IsValidBT ( node N, HashSet<int> H ) 
{
    // function is initially called on the root node with an
    // empty HashSet<int> and is recursively called on 
    // the children, checking for any repeats in which case
    // the tree would be invalid

    if (  H.Contains(N.val) ) return false;
    else  H.Add(N.val);

   if ( left != null && !IsValidBT(left) ) return false;
   if ( right != null && !IsValidBT(right) ) return false; 

   return true; // if made it here, still valid  
}

好的,提示说不使用库,但我认为它们意味着不使用任何提供1行解决方案的库。当然,我至少需要标准库。但是上述逻辑有什么问题吗?除非二进制树以某种方式包含重复值,否则有什么方法可以无效?

1 个答案:

答案 0 :(得分:2)

这似乎更适合codereview.stackexchange.com。但这很简单,所以......

底线,没有。你没有正确回答这个问题。最明显的缺陷是代码无法编译。你已经声明了一个方法IsValidBT(node, HashSet<int>),但是当你调用它时,你只传递一个参数。那不行。

您还不清楚是否正确理解了这个问题。您似乎担心数据中是否存在重复。但 a)从提示中不清楚甚至不允许这样做,而 b)二进制树无效的更明显的原因是数据不是以有序的方式组织(例如,如果父母左边的数字大于父母的价值)。

如评论中所述,您可以在维基百科上找到二进制搜索树的验证(或验证)的经典实现:Binary search tree - Verification。使用node数据结构显示的C ++算法的C#版本可能如下所示:

bool IsBST(node n, int minKey, int maxKey)
{
    if (n == null) return true;

    // Assumes that equal valued children are placed to the left
    if (n.val <= minKey || n.val > maxKey) return false;

    return IsBST(n.left, minKey, n.val) && IsBST(n.right, n.val, maxKey);
}

这样称呼:

IsBST(rootNode, int.MinValue, int.MaxValue);