2010-05-24 6 views
1

Я пытаюсь создать двоичное дерево в scala и должен сделать для него метод, поэтому я пытаюсь сделать функции внутри класса, который имеет дело с дочерними элементами и родителями. Я хочу сделать родительское дерево таким, чтобы я мог рекурсивно вызвать его в другой функции, называемой getPath, но я не могу создать дерево внутри класса Tree. это код:Scala: класс, объявляющий себя как переменную

case class Tree[+T](value: T, left: Option[Tree[T]], right: Option[Tree[T]]) { 
    var parent: Tree[T] = null 

    //method for setting the parent of tree. 
    //this method returns the parent TREE instead of the parent value 
    //so if you want to use it to find the value, you need to get the parent.value 
    def setParent(tree: Tree[T]) { 
parent = tree 
    } 

    //method for returning the parent 
    //the parent is a tree so you have to .value it to get the root 
    def getParent(): Tree[T] = parent 

    //setting parents of left child and right child if they are not empty trees 
    if(left != None) { 
     left.get.setParent(this) 
    } 
    if(right != None) { 
     right.get.setParent(this) 
    } 
} 

def getPath[T](tree: Tree[T]):List[T] = { 
    if(tree.getParent == null) List(tree.value) 
    List(tree.value)++getPath(tree.getParent()) 
} 

я могу установить T на любой, и он будет работать, но тогда я не могу назвать это рекурсивно, если вы делаете. Может ли кто-нибудь помочь мне или есть другой способ получить родителя дерева?

ответ

5

Очистка кода немного, я получаю:

case class Tree[+T](value: T, left: Option[Tree[T]], right: Option[Tree[T]]) { 
    @reflect.BeanProperty 
    var parent: Tree[T] = null 

    //setting parents of left child and right child if they are not empty trees 
    Seq(left, right).flatten.foreach(_.setParent(this)) 
} 

object Tree { 
    def getPath[T](tree: Tree[T]):List[T] = List(tree.value) ++ 
    (if(tree.getParent == null) 
     Nil 
    else 
     getPath(tree.getParent())) 
} 

Это не может скомпилировать с:

tree-parent.scala:1: error: covariant type T occurs in contravariant position in type Tree[T] of parameter of setter parent_=

Тип параметра T появляется в типах производства (геттер для родителей) и потребленных (сеттер для родителя) с помощью этого интерфейса. Соответственно, он должен быть инвариантным:

case class Tree[T] 
+0

Спасибо. Я поражен тем, как вы усовершенствовали мой любительский код так, как вы это делали. Надеюсь, однажды я смогу сделать то же самое. Спасибо! – FireDragonMule

Смежные вопросы