Inorder Traversal具有返回值

时间:2014-12-17 13:27:17

标签: java scala

所以我正在为一棵树进行顺序遍历,代码就是这样的

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

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

我面临一个问题(一个非常愚蠢的问题),当我为两个节点(比如A和B)运行它时,获得了 遍历 的值在为B获取 遍历 时也包括为A运行。由于它是递归函数,我无法定义 遍历 在函数内部。请告诉我们该怎么做。

1 个答案:

答案 0 :(得分:3)

您的代码无法编译,因为您尝试重新分配valval只能初始化一次,无法重新分配。此外,您的代码不像Scala,因为您使用的是nullreturn

对于可能为空的值,您应该使用Option而不是nullnull实际上只存在与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