我是C#的初学者。如果我正确地做了这个面试问题,请告诉我(面试结束了,所以不要以为你在帮我作弊或其他任何事情)。
提示是
编写一个函数来确定给定的二叉树是否不同 整数是一个有效的二叉搜索树。假设每个节点都包含 指向其左子节点的指针,指向其右子节点的指针和 整数,但不是指向其父级的指针。您可以使用任何语言 你喜欢。但是,如果你的语言已经有了库,你可能不会 使用这些库。
public class node
{
node left { get; set; }
node right { get; set; }
int val;
}
(以上是我写的,是否更正了如何根据提示创建节点?因为node
是class
,我的left
和right
是node
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行解决方案的库。当然,我至少需要标准库。但是上述逻辑有什么问题吗?除非二进制树以某种方式包含重复值,否则有什么方法可以无效?
答案 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);