所以我正在为一棵树进行顺序遍历,代码就是这样的
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运行。由于它是递归函数,我无法定义 遍历 在函数内部。请告诉我们该怎么做。
答案 0 :(得分:3)
您的代码无法编译,因为您尝试重新分配val
。 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