Java 带返回值的有序遍历

Java 带返回值的有序遍历,java,scala,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)运

所以我对一棵树进行有序遍历,代码是这样的

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)运行它时,在为a运行时获得的遍历值也包括在为B获得遍历时。因为它是一个递归函数,我也不能在函数内部定义遍历。请告诉我怎么做。

您的代码无法编译,因为您正在尝试重新分配
val
val
只能初始化一次,不能重新分配。另外,您的代码也不是很像Scala,因为您使用的是
null
return

对于可能为空的值,应使用
选项
而不是
null
null
实际上只存在于与Java的互操作性中,在纯Scala代码中应该避免

您不需要使用
return
关键字;在方法中执行的最后一个表达式将自动成为该方法的返回值

这将是一个更好的实现(仍在使用
null
——您需要修改
节点
类以消除此问题):

使用
选项时

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

瓦尔写错了。在我的代码中是var。所以我对它进行了编辑。谢谢你的帮助。非常感谢您提供有关Scala的额外提示。另外,这里您使用了字符串的连接属性,这对我们很有好处。如果有人必须返回其他内容,比如字符串列表(比如在其他问题中?),是否可以编写这样的代码?是的,当然,您可以像连接字符串一样连接列表。这几乎是一样的。
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