<?php
class Nil {}
class Leaf {
public function __construct(public int $value) {}
}
class Node {
public function __construct(public Tree $left, public Tree $right) {}
}
class Tree {
public function __construct(public Nil|Leaf|Node $val) {}
}
function depth(Tree $tree): int {
$val = $tree->val;
return match ($val::class) {
Nil::class => 0,
Leaf::class => 1,
Node::class => 1 + max(depth($val->left), depth($val->right)),
};
}
$treeExample = new Tree(new Node(
new Tree(new Leaf(5)),
new Tree(new Node(
new Tree(new Node(
new Tree(new Nil()),
new Tree(new Leaf(2)),
)),
new Tree(new Nil()),
))
));
print depth($treeExample);