我需要在Scala中镜像二叉树。我认为它必须像这样工作:
sealed trait BT[+A]
case object Empty extends BT[Nothing]
case class Node[+A](elem:A, left:BT[A], right:BT[A]) extends BT[A]
def mirrorTree[A](bt: BT[A]): BT[A] = bt match {
case Empty => Empty
case Node(root, left, right) => Node(root, right, left)
}
val t = Node(1,Node(2,Empty,Node(3,Empty,Empty)),Empty)
mirrorTree(t)
但是它仅返回第一级交换给我,我必须以递归方式为左右子树调用函数,但是如果我必须从函数返回树,我不知道该怎么做,所以我不能使用运算符喜欢列表。
答案 0 :(得分:3)
如果要全部镜像,请执行以下操作:
case Node(root, left, right) => Node(root, mirrorTree(right), mirrorTree(left))
答案 1 :(得分:3)
您非常接近,您只需要递归调用该方法,以确保在构建树的其余部分之前已对子树进行了镜像。
sealed trait BT[+A]
case object Empty extends BT[Nothing]
case class Node[+A](elem:A, left:BT[A], right:BT[A]) extends BT[A]
def mirrorTree[A](bt: BT[A]): BT[A] = bt match {
case Empty => Empty
case Node(root, left, right) =>
val newLeft = mirrorTree(right)
val newRight = mirrorTree(left)
Node(root, newLeft,newRight)
}
val t = Node(1,Node(2,Empty,Node(3,Empty,Node(4,Empty,Empty))),Empty)
mirrorTree(t) // Node(1,Empty,Node(2,Node(3,Node(4,Empty,Empty),Empty),Empty))