2017-09-07 10 views
0

2つのリストに基づいてツリーを生成する方法を知りたいと思います。例えば、プリオーダー、インオーダー所望ツリーの一つを生成する第二の1つを表す最初のもの:2つのリストに基づいてツリーを生成する

data Tree a = Branch a (Tree a) (Tree a) | Leaf deriving Show 
genTree :: [a] -> [a] -> Tree a 
genTree [7,9,2] [9,7,2] = 
Branch 7 (Branch 9 Leaf Leaf) (Branch 2 Leaf Leaf) 

が任意の提案が受け入れられ、ありがとう!

答えて

4

とプレ配列中ルート位置を記述する。だから、:inorderシーケンスの

  1. 最初要素がルートです。次に、サブツリーを順番に左に並べ、その後に右のサブツリーを続ける。右の部分木シーケンスがどこから始まるのかはわかりません。
  2. ルートpreorderシーケンスにある場合、左側が左側のサブツリーのプリオーダーシーケンス、右側が右側のサブツリーのプリオーダーシーケンスです。

は、私たちがこのようなバイナリツリーがあるとします。

1 
/\ 
2 3 
/\ 
    4 5 

preorder: 1 2 3 4 5 
inorder : 2 1 4 3 5 

のは、それをバック作ろう!さて、予約注文シーケンス1 2 3 4 5を見てください。私たちは1が根であることを知っています。

[1] 2 3 4 5 
2 [1] 4 3 5 

2は、サブツリーのインオーダーの順序です。 4 3 5は右のサブツリーです。 、

  1. 左のサブツリーのみノードを持っている右ノードを持っていますし、また、我々は知っています!右の前順シーケンス脇サブツリーの先行順シーケンスを左
  2. が結果として2 3 4 5

である、の左の前順は右のは3 4 5で、2です。

そして、再帰が始まります。私たちは何もないまで!それは空のシーケンスです。それから、我々はLeafに会った。


要約すると、以下のハスケルコードがあります。 (これは、誤入力の状況を処理しません)

data Tree a = Branch a (Tree a) (Tree a) 
      | Leaf 
      deriving Show 
--     pre in 
genTree :: Eq a => [a] -> [a] -> Tree a 
genTree [] [] = Leaf 
genTree (root:pre_seq) in_seq = Branch root left right 
    where 
    (left_in, _:right_in) = break (== root)  in_seq 
    (left_pre, right_pre) = splitAt (length left_in) pre_seq 
    left = genTree left_pre left_in 
    right = genTree right_pre right_in 
+0

一目では、私はそれが正常に重複する値 – luqui

+0

@luquiを含む木を処理していない疑いがあるはい、それは本当だ、これはアルゴリズムを示すだけでピースコードです。重複については、 '0 0 0 0 ... 0'と' 0 0 0 0 ... 0'を使ってツリーを復元する方法は?これは型シグネチャ '[a] - > [a] - > [Tree a]'の別の質問です。 Duplicatesは私たちを列挙します。しかし、彼らは同じ考えを共有しています。 – delta

関連する問題