Please advice is there a way to have a tailrec implementation of "classical" tree depth algo.
import scala.annotation.tailrec
object Tree extends App {
sealed trait Tree[+A]
case class Node[A](value: A,
left: Option[Tree[A]] = None,
right: Option[Tree[A]] = None) extends Tree[A]
object Node:
def apply[A](value: A) =
new Node[A](value = value, left = None, right = None)
def apply[A](value: A, node: Tree[A]) =
new Node[A](value = value, left = Some(node), right = None)
def apply[A](value: A, left: Tree[A], right: Tree[A]) =
new Node[A](value = value, left = Some(left), right = Some(right))
def unapply[A](node: Node[A]): (A, Option[Tree[A]], Option[Tree[A]]) =
(node.value, node.left, node.right)
def go[A](node: Option[Tree[A]]): Int =
node match
case None => 0
case Some(Node(_, left, right)) => Math.max(go(left), go(right)) + 1
val tree = Node(value = "root",
left = Node(value = "a"),
right = Node(value = "b",
left = Node(value = "c"),
right = Node(value = "d")))
println(go(Some(tree)))
}
I've found some pointers to use CPS (continuation passing style) way - but it still fails for me.
Thanks.