【问题标题】:How to mirror binary tree?如何镜像二叉树?
【发布时间】:2019-05-04 11:07:12
【问题描述】:

我需要在 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)

但它只返回我交换的第一级,我必须以递归方式为左右子树调用函数,但如果我必须从函数返回树,我不知道该怎么做,所以我不能使用运算符喜欢列表。

【问题讨论】:

  • 作为附注,你应该标记你的case classfinal!,reference

标签: scala function functional-programming


【解决方案1】:

如果您想全部镜像,请执行以下操作:

case Node(root, left, right) => Node(root, mirrorTree(right), mirrorTree(left))

【讨论】:

    【解决方案2】:

    您非常接近,您只需要递归调用该方法,以确保在构建树的其余部分之前镜像子树。

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2015-10-02
      • 2021-08-24
      相关资源
      最近更新 更多