递归枚举器

时间:2012-12-05 14:22:53

标签: c# iterator ienumerable binary-search-tree yield-return

我正准备接受采访,所以作为练习我已经实现了算法,以检查二叉树是否为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循环(仍然使用递归和收益)?

1 个答案:

答案 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;
}

这是否比你现有的更好是有争议的。