2014-12-17 3 views
1

Так я делаю Симметричный обходе для дерева, для которых код выходит что-то вроде этогоСимметричного Traversal с возвращаемым значением

var traversal:String = "" 
def inorder(node: Node): String = { 

if (node == null) 
    return traversal 
inorder(node.leftChild) 
traversal += node.label 
inorder(node.rightChild) 
return traversal 
} 

я столкнулся вопрос, хотя (очень глупый), что, когда я запустить его для двух узлов (скажем, а и в), значение обхода, полученном во время работы для а также включается при получении обхода для B. Так как это рекурсивная функция, я не могу определить обход внутри функции. Расскажите, как это сделать.

ответ

3

Ваш код не компилируется, потому что вы пытаетесь повторно назначить val. A val может быть инициализирован только один раз и не может быть повторно назначен. Кроме того, ваш код не очень похож на Scala, потому что вы используете null и return.

Для значений, которые потенциально могут быть пустыми, вы должны использовать Option вместо null. null действительно существует только для взаимодействия с Java, и его следует избегать в чистом коде Scala.

Вам не нужно использовать ключевое слово return; последнее выражение, которое выполняется в методе, автоматически возвращает возвращаемое значение метода.

Это было бы лучше, реализация (по-прежнему с помощью null - вам необходимо изменить свой Node класс, чтобы избавиться от этого):

def inorder(node: Node): String = 
    if (node == null) "" 
    else inorder(node.leftChild) + node.label + inorder(node.rightChild) 

При использовании Option:

case class Node(leftChild: Option[Node], label: String, rightChild: Option[Node]) 

def inorder(node: Option[Node]): String = 
    node map { n => inorder(n.leftChild) + n.label + inorder(n.rightChild) } getOrElse "" 

Пример использование:

scala> val tree = Node(Some(Node(None, "left", None)), "root", Some(Node(None, "right", None))) 
tree: Node = Node(Some(Node(None,left,None)),root,Some(Node(None,right,None))) 

scala> inorder(Some(tree)) 
res2: String = leftrootright 
+0

val написан там по ошибке , Это var в моем коде. Поэтому я отредактировал это. Спасибо за помощь. И так замечательно, что вы предоставили дополнительные советы о Scala. –

+0

Кроме того, здесь вы использовали свойство конкатенации строки в наших интересах. Можно ли написать такой код, если кто-то должен вернуть что-то еще, скажем, список строк (скажем, в какой-то другой проблеме?) –

+1

Да, конечно, вы можете объединить списки так же, как вы можете объединить строки. Это было бы почти то же самое. – Jesper

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