Scala二叉树,设置下一个"节点"导航时

时间:2014-11-27 11:14:26

标签: scala intellij-idea binary-tree covariance

我有一棵二叉树。我问用户一个问题,如果他说是,我给他左分支,否则我给他正确的分支。 (方法:get_answer2)

但是当我这样做时:

var current_node = Node("Test")
current_node.set_left = Node("End node")
current_node = current_node.get_answer2("y")

我得到了

Tree [Nothing]类型的表达式不符合预期类型Tree [Nothing](来自IntelliJ)

sealed abstract class Tree[+T] {
}
case object End extends Tree[Nothing] {
  var left = "Blah"
  var right = "Blah"

  override def toString = "."
}

case class Node[T](var question: String,  var left: Tree[T] = End, var right: Tree[T] = End) extends Tree[T] {

  def get_answer2(answer: String) ={
    if (answer == "y"){
      right
    }else{
      left
    }
  }

  def change_left_tree( new_tree : Tree[T]) = {left = new_tree}
  def change_right_tree( new_tree : Tree[T]) = {right = new_tree}
}

1 个答案:

答案 0 :(得分:0)

消化解决方案:

var current_node = Node("Test")
current_node.left = Node("End node")
var answer = current_node.get_answer2("n")
answer match {
    case End => {
        println("Empty")
        }
    case x: Node[_] => {
        println("Node")
        current_node = x
        println(current_node)
    }
}

您的代码问题是该变量' left'被声明为树。树比Node更广泛。对于编译器而言,分配给变量' left'的对象并不重要。属于'节点'。

在我的解决方案var'回答'属于'树'。将其投射到类型节点'我使用过'匹配'有两种情况的构造(第一个用于空节点,第二个用于非空)