0

我正在准备面试,所以作为练习,我已经实现了算法来检查二叉树是否是 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 循环(仍然使用递归和产量)?

4

1 回答 1

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

这是否比你目前拥有的更好是值得商榷的。

于 2012-12-05T14:28:03.480 回答