我正准备接受采访,所以作为练习我已经实现了算法,以检查二叉树是否为BST。
public static bool CheckBST(this Node root)
{
if (root == null) throw new ArgumentException("root");
Node previous = null;
foreach (var node in GetNodes(root))
{
if (previous != null && node.value <= previous.value)
{
return false;
}
previous = node;
}
return true;
}
private static IEnumerable<Node> GetNodes(Node root)
{
if (root.left != null)
{
foreach (var node in GetNodes(root.left))
{
yield return node;
}
}
yield return root;
if (root.right != null)
{
foreach (var node in GetNodes(root.right))
{
yield return node;
}
}
}
可以摆脱foreach循环(仍然使用递归和收益)?
答案 0 :(得分:3)
不,不幸的是,没有办法实现这一目标
没有yield return many GetNodes(...);
这样的内容,也不允许混合yield return
和普通return
。
但是,您可以使用LINQ:
实现所需的结果(延迟执行)private static IEnumerable<Node> GetNodes(Node root)
{
var result = Enumerable.Empty<Node>();
if (root.left != null)
result = result.Concat(GetNodes(root.left));
result = result.Concat(new [] { root });
if (root.right != null)
result = result.Concat(GetNodes(root.right));
return result;
}
这是否比你现有的更好是有争议的。