From 68abd053761fa16b02ae63e24e365c0498319095 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sun, 23 Jan 2022 21:07:28 +0100 Subject: [PATCH] move --- src/basic_search.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/basic_search.rs diff --git a/src/basic_search.rs b/src/basic_search.rs new file mode 100644 index 0000000..a1c3f12 --- /dev/null +++ b/src/basic_search.rs @@ -0,0 +1,68 @@ +use crate::Node; +use std::collections::VecDeque; + +struct Node { + value: T, + children: Vec>, +} + +pub fn breadth_first_search(tree: &Node, searched: &T) -> bool { + let mut candidates = VecDeque::new(); + candidates.push_back(tree); + + loop { + if let Some(candidate) = candidates.pop_front() { + if candidate.value == *searched { + return true; + } + + candidates.extend(candidate.children.iter()); + } else { + break; + } + } + + false +} + +pub fn depth_first_search(tree: &Node, searched: &T) -> bool { + if tree.value == *searched { + return true; + } + + for child in &tree.children { + if depth_first_search(&child, searched) { + return true; + } + } + + false +} + +#[cfg(test)] +mod tests { + use crate::basic_search::{self, Node}; + use crate::tree; + + #[test] + fn dfs() { + let tree = tree!(1, tree!(6, tree!(5), tree!(4)), tree!(6)); + + let has_seven = basic_search::depth_first_search(&tree, &7); + let has_five = basic_search::depth_first_search(&tree, &5); + + assert!(!has_seven); + assert!(has_five); + } + + #[test] + fn bfs() { + let tree = tree!(1, tree!(6, tree!(5), tree!(4)), tree!(6)); + + let has_seven = basic_search::breadth_first_search(&tree, &7); + let has_five = basic_search::breadth_first_search(&tree, &5); + + assert!(!has_seven); + assert!(has_five); + } +}