#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TreeNode<T> {
pub value: T,
pub children: Vec<TreeNode<T>>,
}
impl<T> TreeNode<T> {
#[must_use]
pub fn new(value: T) -> Self {
Self {
value,
children: Vec::new(),
}
}
pub fn add_child(&mut self, child: TreeNode<T>) {
self.children.push(child);
}
#[must_use]
pub fn is_leaf(&self) -> bool {
self.children.is_empty()
}
#[must_use]
pub fn depth(&self) -> usize {
if self.children.is_empty() {
0
} else {
1 + self.children.iter().map(TreeNode::depth).max().unwrap_or(0)
}
}
}
#[cfg(test)]
mod tests {
use super::TreeNode;
#[test]
fn new_nodes_start_as_leaves() {
let node = TreeNode::new("root");
assert!(node.is_leaf());
assert_eq!(node.depth(), 0);
}
#[test]
fn add_child_makes_node_non_leaf() {
let mut node = TreeNode::new("root");
node.add_child(TreeNode::new("child"));
assert!(!node.is_leaf());
assert_eq!(node.children.len(), 1);
}
#[test]
fn depth_tracks_longest_branch() {
let mut root = TreeNode::new("root");
let mut child = TreeNode::new("child");
child.add_child(TreeNode::new("grandchild"));
root.add_child(child);
root.add_child(TreeNode::new("sibling"));
assert_eq!(root.depth(), 2);
}
}