// Internal Nodes โ 99 Problems #32
// Collect the internal nodes of a binary tree.
// An internal node has at least one non-Leaf child.
#[derive(Debug, PartialEq, Clone)]
enum Tree<T> {
Leaf,
Node(Box<Tree<T>>, T, Box<Tree<T>>),
}
impl<T: Clone> Tree<T> {
fn leaf() -> Self { Tree::Leaf }
fn node(l: Tree<T>, v: T, r: Tree<T>) -> Self {
Tree::Node(Box::new(l), v, Box::new(r))
}
}
fn internals<T: Clone>(tree: &Tree<T>) -> Vec<T> {
match tree {
Tree::Leaf => vec![],
Tree::Node(l, v, r) => match (l.as_ref(), r.as_ref()) {
// Both children are Leaf โ this is a leaf node, not internal
(Tree::Leaf, Tree::Leaf) => vec![],
_ => {
// This node is internal
let mut result = internals(l);
result.push(v.clone());
result.extend(internals(r));
result
}
},
}
}
fn sample_tree() -> Tree<char> {
// a โ internal (has children b, c)
// / \
// b c โ b is internal; c is leaf
// / \
// d e โ d, e are leaves
Tree::node(
Tree::node(
Tree::node(Tree::leaf(), 'd', Tree::leaf()),
'b',
Tree::node(Tree::leaf(), 'e', Tree::leaf()),
),
'a',
Tree::node(Tree::leaf(), 'c', Tree::leaf()),
)
}
fn main() {
let t = sample_tree();
println!("Internal nodes: {:?}", internals(&t)); // [b, a] or similar in-order
let single = Tree::node(Tree::leaf(), 'z', Tree::leaf());
println!("Single node internals: {:?}", internals(&single)); // []
let chain = Tree::node(
Tree::leaf(),
1,
Tree::node(Tree::leaf(), 2, Tree::node(Tree::leaf(), 3, Tree::leaf())),
);
println!("Chain internals: {:?}", internals(&chain)); // [1, 2]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty() {
let t: Tree<i32> = Tree::leaf();
assert_eq!(internals(&t), vec![]);
}
#[test]
fn test_single_node_is_not_internal() {
let t = Tree::node(Tree::leaf(), 42, Tree::leaf());
assert_eq!(internals(&t), vec![]);
}
#[test]
fn test_sample_tree() {
// b and a are internal; c, d, e are leaves
let result = internals(&sample_tree());
assert!(result.contains(&'a'));
assert!(result.contains(&'b'));
assert!(!result.contains(&'c'));
assert_eq!(result.len(), 2);
}
#[test]
fn test_chain() {
let chain = Tree::node(
Tree::leaf(),
1,
Tree::node(Tree::leaf(), 2, Tree::node(Tree::leaf(), 3, Tree::leaf())),
);
assert_eq!(internals(&chain), vec![1, 2]);
}
}
(* Internal Nodes *)
(* OCaml 99 Problems #32 *)
(* Implementation for example 32 *)
(* Tests *)
let () =
(* Add tests *)
print_endline "โ OCaml tests passed"