From fdba35e4acde8eb11ffd67812b2db857b470b23e Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sun, 23 Jan 2022 20:44:57 +0100 Subject: [PATCH] dfs and bfs --- .gitignore | 3 ++ Cargo.toml | 8 ++++++ src/lib.rs | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..408b8a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +Cargo.lock +.idea \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..06f5afd --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "game_trees" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..32d1738 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,81 @@ +#![allow(dead_code)] + +pub struct Node { + value: T, + children: Vec>, +} + +#[macro_export] +macro_rules! tree { + ($first:expr $(, $($rest:expr),*)?) => { + $crate::Node { + value: $first, + children: vec![$($($rest),*)?], + } + }; +} + +mod search { + use crate::Node; + use std::collections::VecDeque; + + 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::search; + + #[test] + fn dfs() { + let tree = tree!(1, tree!(6, tree!(5), tree!(4)), tree!(6)); + + let has_seven = search::depth_first_search(&tree, &7); + let has_five = 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 = search::breadth_first_search(&tree, &7); + let has_five = search::breadth_first_search(&tree, &5); + + assert!(!has_seven); + assert!(has_five); + } +}