インタビューの準備をしているので、演習として、二分木が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ループを取り除くことができますか(まだ再帰とyieldを使用しています)?