Be concise.
Be useful.
All contributions dictatorially edited by webmasters to match personal tastes.
Please do not paste any copyright violating material.
Please try to avoid dependencies to third-party libraries and frameworks.
void dfs(Node& root, std::function<void(Node*)> f) { std::stack<Node*> queue; queue.push(&root); std::unordered_set<const Node*> visited; while (!queue.empty()) { Node* const node = queue.top(); queue.pop(); f(node); visited.insert(node); for (Node* const neighbor : node->neighbors) { if (visited.find(neighbor) == visited.end()) { queue.push(neighbor); } } } }
func (v *Vertex) Dfs(f func(*Vertex), seen map[*Vertex]bool) { seen[v] = true f(v) for next, isEdge := range v.Neighbours { if isEdge && !seen[next] { next.Dfs(f, seen) } } }
def depth_first(start, f): seen = set() stack = [start] while stack: vertex = stack.pop() f(vertex) seen.add(vertex) stack.extend( v for v in vertex.adjacent if v not in seen )
struct Vertex<V> { value: V, neighbours: Vec<Weak<RefCell<Vertex<V>>>>, } // ... fn dft_helper(start: Rc<RefCell<Vertex<V>>>, f: &impl Fn(&V), s: &mut Vec<*const Vertex<V>>) { s.push(start.as_ptr()); (f)(&start.borrow().value); for n in &start.borrow().neighbours { let n = n.upgrade().expect("Invalid neighbor"); if s.iter().all(|&p| p != n.as_ptr()) { Self::dft_helper(n, f, s); } } }