Problem 70b

Generate a string representation of a multiway tree in depth-first order. Insert the special character ^ whenever the move is a backtrack to the previous level.

By this rule, the tree below is represented as: afg^^c^bd^e^^^

a) Write a function to convert a multiway tree to a string representation.

b) Write a function to convert a string representation to a multiway tree.

Example

type MTree a = MNode a (List (MTree a))

mtree70 = MNode 'a' 
          [ MNode 'f' [ MNode 'g' [] ]
          , MNode 'c' []
          , MNode 'b' [ MNode 'd' [], MNode 'e' [] ]
          ]

s70 = "afg^^c^bd^e^^^"

s70 == treeToString <| stringToTree s70

Unit Test

import Html
import List
import Maybe
import String


type MTree a = MNode a (List (MTree a))

stringToTree : String -> MTree Char
stringToTree s =
    -- your implemenation goes here
    MNode 'X' []


treeToString : MTree Char -> String
treeToString tree =
    "Your implementation goes here"


main =
    Html.text
        (if (test) then
            "Your implementation passed all tests."
         else
            "Your implementation failed at least one test."
        )


test : Bool
test =
    List.all ((==) True)
      [ mtree70 == stringToTree string70
      , string70 == treeToString mtree70
      , aT == stringToTree aS
      , aS == treeToString aT
      ]


aS = "af^c^b^^"
aT = MNode 'a' 
          [ MNode 'f' [] 
          , MNode 'c' []
          , MNode 'b' []
          ]

string70 = "afg^^c^bd^e^^^"
mtree70 = MNode 'a' 
          [ MNode 'f' [ MNode 'g' [] ]
          , MNode 'c' []
          , MNode 'b' [ MNode 'd' [], MNode 'e' [] ]
          ]

Hints

  1. This problem is similar to Problem 69.
  2. Traverse the tree in pre-order with a function that returns two values, the tree value and the unused portion of the string.
  3. Treating the root node differently that the rest of the tree may result in simpler functions.
  4. List.intersperse, List.fromChar, List.cons and List.uncons may come in handy

Solution

Solution

results matching ""

    No results matching ""