将树结构转换为前缀表示法

时间:2016-03-09 22:25:43

标签: scala

在下面的代码中,我创建了一个表示操作的树结构

((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)


}

1 个答案:

答案 0 :(得分:1)

如果您要将Node课程重组为TreeLeaf,则问题会更加简单 这对于递归数据结构很常见。

在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)
   }
 }

不幸的是,这个解决方案不是尾递归