diff --git a/day12/src/node.rs b/day12/src/node.rs new file mode 100644 index 0000000..faae32a --- /dev/null +++ b/day12/src/node.rs @@ -0,0 +1,68 @@ +#[derive(Debug, Default, Clone)] +pub struct Node { + pub idx: usize, + pub parents: Vec, + pub children: Vec, +} + +impl Node { + pub fn new(idx: usize) -> Self { + Node { + idx, + ..Node::default() + } + } + + pub fn add_child(&mut self, value: usize) -> &mut Self { + let mut child = Node::new(value); + child.parents.append(&mut self.parents.clone()); + child.parents.push(self.idx); + + self.append(child); + + self.children + .last_mut() + .unwrap() + } + + fn append(&mut self, node: Node) -> &mut Self { + self.children.push(node); + + self + } + + fn is_leaf(&self) -> bool { + self.children.is_empty() + } + + pub fn contains(&self, value: usize) -> bool { + if self.idx == value { + return true; + } + + self.parents.contains(&value) + } + + pub fn get_leaves(&self) -> Vec<&Node> { + if self.is_leaf() { + return vec![self]; + } + + let mut leaves = Vec::new(); + + let children = self + .children + .iter(); + + for child in children { + let mut child_leaves = child.get_leaves(); + leaves.append(&mut child_leaves); + } + + leaves + } + + pub fn get_len(&self) -> usize { + self.parents.len() + } +} \ No newline at end of file