2015-01-01 3 views
0

내가 어떤 이해 순서없이, 통과 후 노드를 출력 코드의이 비트를 가지고에 나무와 출력 트래버스 :하스켈 - 목록

preorder :: Tree a -> [a] 
preorder Empty = [] 
preorder (Branch x e d) = [x]++(preorder e)++(preorder d) 

createTree = Branch 'A' 
        (Branch 'B' 
          (Branch 'E' Empty Empty) 
          (Branch 'B' Empty Empty) 
       ) 
        (Branch 'A' 
          (Branch 'E' Empty Empty) 
          (Branch 'A' Empty Empty) 
       ) 

preordercreateTree에 출력 적용 :

ABEBAEA 

을 내가 원하는 것은 루트에서가는 모든 경로 목록입니다.

["ABE","ABB","AAE","AAA"] 

나는 이것을 어떻게하는지에 관해 모른다, 나는 하스켈에서의 초심자 다!

제공되는 모든 도움에 감사드립니다. 이것에

+1

나는'preorder' 기능이와 무슨 상관이 표시되지 않습니다. – leftaroundabout

+0

이것은 이해하기 쉬운 순서입니다 : 접두어 순서, ther는 중위어 순서 및 접미사 순서입니다. 하지만 아마 모든 노드에 대한 경로를 표시하기를 원할 것입니다. 그래서 여러분은 아마 여러분의 질문을 이해하는 방법이기도합니다.이를 달성하기 위해 스택을 사용해야합니다. – Yoda

+1

당신의 예제는'Branch 'A'Empty (Branch 'B'Empty Empty)'의 경로가 무엇인지 명확히하지 않는다. '[ "AB"]'또는 [[A ","AB "]'라고 말할 수 있습니다. – chi

답변

4

이 운동 양 : 빈 트리의 경로는 무엇

  • ?
  • ed은 각각 경로 목록이 epdp 인 트리가되도록합니다. x이라는 레이블이 있고 ed을 하위 트리로 갖는 트리의 경로를 계산하는 방법은 무엇입니까? 자신의 예와 관련된

그래서, 여분의 힌트로

paths :: Tree a -> [[a]] 
paths Empty = ??? 
paths (Branch x e d) = ??? -- use x,ep,dp accordingly 
     where ep = paths e 
      dp = paths d 

는 :

[ 'A':xs | xs <- ["BE","BB"] ] = [ "ABE" , "ABB" ] 

["BE","BB"] 것을 첫 번째 하위 트리에 대한 경로입니다.

1
paths :: Tree a -> [[a]] 
paths Empty     = [[]] 
paths (Branch x Empty d ) = map (x:) $ paths d 
paths (Branch x e  Empty) = map (x:) $ paths e 
paths (Branch x e  d ) = map (x:) $ paths e ++ paths d 

.l.e. 모든 하위 경로 앞에 x을 붙이기 만하면됩니다.

createTree = Branch 'A' 
        (Branch 'B' 
          (Branch 'E' Empty (Branch 'A' Empty Empty)) 
          (Branch 'B' Empty Empty) 
       ) 
        (Branch 'A' 
          (Branch 'E' Empty Empty) 
          (Branch 'A' Empty Empty) 
       ) 

main = print $ paths createTree 

인쇄 ["ABEA","ABB","AAE","AAA"]