2016-09-05 7 views
2

コンピュータサイエンスの初心者のビット。文字列からRubyバイナリツリーを構築する

私はRubyでバイナリツリーの基本を持っている:私は、例えば、手動でそれを構築する場合、私はtombenの子ノードになりたい場合は

class Node 
    attr_accessor :left, :right, :value 
    def initialize(value) 
    @value = value 
    end 
end 

これは、正常に動作します:

ben = Node.new('Ben') 
tom = Node.new('Tom') 

ben.left = tom 

私が把握する必要がある課題の1つは、入力された親子ペアのツリーを構築する方法です。ここでは例として入力文字列です:

peter tom 
peter marie 
marie john 
tom oscar 

私のバイナリツリーは次のようになります。

peter 
     | 
tom  marie 
    |  | 
oscar  john 

私はに次の形式"[parent] [child]"で複数の文字列を変換するにいくつかの方向性を得ることができる場合、私は疑問に思ってバイナリツリー。

感謝:)

+1

'[親] [子]'フォーマットでは、あなたは子供がleft' 'に入るかどうかを決定しますどのようにか「正しい」?同様に、入力に与えられた親に対して2つ以上の子エントリが含まれている場合はどうなりますか? – Stefan

+0

値は一意にすることができますか? –

答えて

2

は、データを格納するためのハッシュを使用します。

data = Hash.new { |h, k| h[k] = Node.new k } 

while !(line = gets.strip).empty? 
    parent, child = line.split.map { |value| data[value] } 
    if !parent.left 
     parent.left = child 
    elsif !parent.right 
     parent.right = child 
    else 
     raise "#{parent.value} already has both a left and right child" 
    end 
end 
+0

良い解決策、特に 'data'を定義した方法。一つの小さなこと:あなたは 'while(line = gets.strip)!= '''のようなものが必要です。それはあなたがループから抜け出すことは決してありません。 –

+0

@CarySwovelandが修正されました。 – nloveladyallen

+0

素晴らしいソリューション!完璧に働いた。ありがとう – Allister

関連する問題