// Layout Binary Tree โ 99 Problems #35
// Assign (x, y) coordinates to each node in a binary tree.
// x = in-order position (1-based), y = depth (1-based, root=1).
#[derive(Debug, PartialEq, Clone)]
enum Tree<T> {
Leaf,
Node(Box<Tree<T>>, T, Box<Tree<T>>),
}
#[derive(Debug, PartialEq, Clone)]
struct LayoutNode<T> {
val: T,
x: usize,
y: usize,
}
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))
}
}
/// In-order layout: x is the in-order position, y is depth.
fn layout<T: Clone>(tree: &Tree<T>) -> Vec<LayoutNode<T>> {
fn aux<T: Clone>(tree: &Tree<T>, depth: usize, counter: &mut usize) -> Vec<LayoutNode<T>> {
match tree {
Tree::Leaf => vec![],
Tree::Node(l, v, r) => {
let mut result = aux(l, depth + 1, counter);
*counter += 1;
result.push(LayoutNode { val: v.clone(), x: *counter, y: depth });
result.extend(aux(r, depth + 1, counter));
result
}
}
}
let mut counter = 0;
aux(tree, 1, &mut counter)
}
fn sample_tree() -> Tree<char> {
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();
let layout_result = layout(&t);
println!("Layout (in-order):");
for node in &layout_result {
println!(" '{}' at ({}, {})", node.val, node.x, node.y);
}
// d(1,3) b(2,2) e(3,3) a(4,1) c(5,2)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty() {
let t: Tree<i32> = Tree::leaf();
assert_eq!(layout(&t), vec![]);
}
#[test]
fn test_single_node() {
let t = Tree::node(Tree::leaf(), 'a', Tree::leaf());
let result = layout(&t);
assert_eq!(result.len(), 1);
assert_eq!(result[0], LayoutNode { val: 'a', x: 1, y: 1 });
}
#[test]
fn test_in_order_positions() {
// In a tree with in-order d,b,e,a,c โ positions are 1,2,3,4,5
let result = layout(&sample_tree());
let positions: Vec<usize> = result.iter().map(|n| n.x).collect();
assert_eq!(positions, vec![1, 2, 3, 4, 5]);
}
#[test]
fn test_root_at_depth_1() {
let result = layout(&sample_tree());
let root = result.iter().find(|n| n.val == 'a').unwrap();
assert_eq!(root.y, 1);
}
}
(* Layout Binary Tree *)
(* OCaml 99 Problems #35 *)
(* Implementation for example 35 *)
(* Tests *)
let () =
(* Add tests *)
print_endline "โ OCaml tests passed"