''' class OysterIterator : IIterator { enum NodeType { Left, Right, Self, None } private BSTNode Root { get; set; } private OysterIterator Iterator { get; set; } private NodeType NodeToGet { get; set; } private bool HasParent { get; set; } public OysterIterator(BSTNode root) { Root = root; Reset(); } private OysterIterator(BSTNode root, bool hasParent): this(root) { HasParent = hasParent; } // Left branch -> Root -> Right branch -> Null/Reset public BSTNode Next() { if (NodeToGet == NodeType.None) if (!HasParent) // Only the top root should reset the iterator { Reset(); if (NodeToGet == NodeType.None) // After reset it can still be empty (so the collection is empty) return null; } else return null; if (NodeToGet == NodeType.Self) { if (Root.Right == null) NodeToGet = NodeType.None; else { NodeToGet = NodeType.Right; Iterator = new OysterIterator(Root.Right, true); } return Root; } var node = Iterator.Next(); if (node == null) { if (NodeToGet == NodeType.Left) NodeToGet = NodeType.Self; else // right node returned null NodeToGet = NodeType.None; node = Next(); } return node; } public void Reset() { Iterator = null; NodeToGet = NodeType.None; if (Root == null) return; if (Root.Left != null) { Iterator = new OysterIterator(Root.Left, true); NodeToGet = NodeType.Left; } else NodeToGet = NodeType.Self; } } '''