Advertisement
Guest User

Untitled

a guest
May 24th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. case class Node(value: Int,
  2. left: Option[Node] = None,
  3. right: Option[Node] = None)
  4.  
  5. object Serializer {
  6. private val pattern = "^(\\d+)\\((.*)\\)$".r
  7. private val treeOpen = '('
  8. private val treeClose = ')'
  9. private val separator = ','
  10.  
  11. def serialize(nodeOption: Option[Node]): String = nodeOption match {
  12. case Some(Node(value, left, right)) =>
  13. val leftStr = serialize(left)
  14. val rightStr = serialize(right)
  15. s"$value$treeOpen$leftStr$separator$rightStr$treeClose"
  16.  
  17. case None => ""
  18. }
  19.  
  20. def deserialize(str: String): Option[Node] = {
  21. str match {
  22. case pattern(value, inner) =>
  23. val (left, right) = splitInner(inner)
  24. Some(Node(value.toInt, deserialize(left), deserialize(right)))
  25.  
  26. case _ => None
  27. }
  28. }
  29.  
  30. private def splitInner(inner: String): (String, String) = {
  31. var balance = 0
  32. val left = inner.takeWhile {
  33. case `treeOpen` => balance += 1; true
  34. case `treeClose` => balance -= 1; true
  35. case `separator` if balance == 0 => false
  36. case _ => true
  37. }
  38.  
  39. val right = inner.drop(left.length + 1)
  40.  
  41. (left, right)
  42. }
  43. }
  44.  
  45. val tree = Some(Node(
  46. 1,
  47. Some(Node(2, Some(Node(3)))),
  48. Some(Node(4,
  49. Some(Node(5)),
  50. Some(Node(6))
  51. ))
  52. ))
  53.  
  54. val serialized = Serializer.serialize(tree)
  55. var deserialized = Serializer.deserialize(serialized)
  56.  
  57. assert(tree == deserialized)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement