2012-02-04 8 views
1

どのようにして、配列ベースのツリーを1つの順序に変換できますか?配列は含まれています配列ベースのバイナリツリープリオーダ

乾杯

public void preOrder(int index) { 

    if (index >= currSize) { 
     return; 
    } 

    System.out.println(items[index]); 
    preOrder(2^index + 1); //left 
    preOrder((2^index) + 2); //right 
} 
+0

7の親は何ですか?詳細を追加してください。それは、n番目の要素の子が位置2 ** nと2 **(n + 1)にあるヒープのようなものですか? (インデックスは1から始まると仮定します) – MAK

+0

7はリーフで、完全なバイナリツリーです。 –

+0

はこの家事ですか? –

答えて

1

以下のようになります。

public void preOrder(int index) { 

    if (index >= currSize) { 
     return; 
    } 
    System.out.println(items[index]); 
    preOrder((2 * index)+1); 
    preOrder((2 * index)+2); 
} 
2

プリオーダートラバーサルでは、あなたは、あなたが再帰的に左部分木と右のサブツリーを処理する、最初の親を処理します。あなたが持っている表現は基本的にヒープの表現と同じです。したがって、どのノードの左と右の子が何であるかは明らかです。つまり、これを事前注文でトラバースし、ノードを訪問順にプリントアウトすることができます。

擬似コードは以下のようになり:

print_pre_order(index): 
    if index is beyond the size of the array: 
    return 
    else: 
    print value at index 
    print_pre_order(left child of index) 
    print_pre_order(right child of index) 

これは、各インデックスに対して、ヒープとして配置され、N左の子が2 * であり、nおよび右の子がn 2 *(になっているので+1)。配列のインデックスは1から始まると仮定していますが(ほとんどの言語は0から始まりますが)、0ベースの配列には簡単に適応できます。

+0

論理は正しいものの、何も印刷されないようです。 –

+0

私はメインポストで思い付いた方法を投稿しました。 –

+0

@jonny: '^'は累乗ではなく、JavaのXOR演算子です。 '2^n'を' 1 << n'に置き換えてください(nの左シフトは2 ** nと同じです)。 – MAK

関連する問題