public void Run <TTree>(TTree tree) where TTree : ITree <TNode> { //_toVisit.Enqueue(tree); _toVisit.Put(tree); while (_toVisit.Any() && _stopSearch == false) { //var current = _toVisit.Dequeue(); var current = _toVisit.Pull(); var node = current.Node; Enter(current); FollowChildrenIfNeeded(current); } while (_lastEntered != default(ITree <TNode>)) { _nodeVisitor.OnLeave(_lastEntered, this); _lastEntered = _lastEntered.Parent; } }