在下面的代码中,我创建了一个表示操作的树结构
((1 + y) / (1 + 2z^2))
如何在前缀中表示此表达式:
( / (1 + y) (1 + 2z^2))
我编写了一个遍历函数,它只是递归遍历树,但是如何重新排列树?
object ast extends App {
case class Node(value: String, leftLeaf: Option[Node], rightLeaf: Option[Node])
val node1 = Node("+", Some(Node("1", None, None)), Some(Node("y", None, None)))
val node2 = Node("+", Some(Node("1", None, None)), Some(Node("2z ^2", None, None)))
val node3 = Node("/", Some(node1), Some(node2))
def traverse(parent: Node): Unit = {
parent match {
case Node(s: String, Some(l: Node), Some(r: Node)) => {
println(s + " , l : "+l.leftLeaf.getOrElse("")+ " , r : "+l.rightLeaf.getOrElse(""));
traverse(l)
traverse(r)
}
case Node(s: String, None, None) => {
println("s is " + s);
}
}
}
traverse(node3)
}
答案 0 :(得分:1)
如果您要将Node
课程重组为Tree
和Leaf
,则问题会更加简单
这对于递归数据结构很常见。
在scala中,您不需要使用;
并且可以省略许多括号。
object Ast {
sealed trait Node
case class Leaf(op: String, left: String, right: String) extends Node
case class Tree(op: String, left: Node, right: Node) extends Node
def traverse(node: Node): String = node match {
//use string contexts to produce a string
case Leaf(op, l, r) => s"($l $op $r)"
case Tree(op, l, r) => s"($op ${traverse(l)} ${traverse(r)})"
}
def main(args: Array[String]) {
val node1 = Leaf("+", "1", "y")
val node2 = Leaf("+", "1", "2z ^2")
val node3 = Tree("/", node1, node2)
val result = traverse(node3)
// prints out "(/ (1 + y) (1 + 2z ^2))"
println(result)
}
}
不幸的是,这个解决方案不是尾递归