2017-04-08 6 views
0

特定の数式でバイナリ検索ツリーを実装するには、配列を使用する必要があります。ルートはtree [0]です。ツリー[n]のノードの場合、ツリーの[2n + 1](左側のブランチ)とツリー[2n + 2](右側のブランチ)にnの子があります。私は、BSTを格納するために2番目の配列を作成することができます。この特定の数式を持つソートされていない配列を使用してバイナリ検索ツリーを実装する方法は?

for(i=1;i<;i++) { 
    //Every iteration we start from the root node 
    while (the cell is not empty){ 
     if(less than the element) 
     go to 2i+1; 
     else if (greater than the element) 
     go to 2i+2; 

はこれまでのところ、この私がブレインストーミング何:

public class BinarySearchTree { 

    public void createBST(int[] array) { 

     int[] tree = new int[array.length]; 

     int root = array[0]; 

     for (int i = 0; i < array.length; i++) { 
      if (array[i] < root) { 
       tree[(2*i)+1] = array[i]; 
      } else { 
       array[(2 * i) + 2]; 
      } 
     } 
    } 
} 

私はここから行くかわからないん私は擬似コードを与えられています。私は解決策なしでこれをしばらく行ってきました。どんな助けもありがとうございます。ありがとうございました。

答えて

0

擬似コードは決してツリーを作成しません。

すべての配列値は比較にのみ関連し、興味深い情報はインデックスです。また、「行く」は位置を変更する。その位置はどこかに格納する必要があります(ルートから開始します)。

Integer[] tree = new Integer[array.length] 
//the element to add is array[i] 
for (int i = 0; i < array.length; ++i) { 
    //every iteration starts from the root node 
    int pos = 0; 
    //while the cell is not empty 
    while (tree[pos] != null) { 
     //if the cell is smaller than the element 
     if (tree[pos] < array[i]) { 
      //go to 2n+1 
      pos = 2 * pos + 1; 
     } else { 
      //go to 2n+2 
      pos = 2 * pos + 2; 
     } 
    } 
    //add at the empty position. 
    tree[pos] = array[i]; 
} 

注:これはテストしていないため、何らかの点でArrayIndexOutBoundExceptionがスローされる可能性があります。

+0

ありがとうございます!私はコードを実行し、ArrayIndexOutOfBoundExceptionがあります。私はarray.lengthの変更を試み、余分なif文をpos> array.lengthのときに追加しようとしましたが、結果はありません。 whileループステートメントかもしれないと思います。これを修正する方法はありますか? – Jen

+0

根本的な問題は、シーケンス '1; 2; 3; 4"を追加する擬似コードに続いて '0; 2; 6; 14'の位置に格納されますが、配列の長さは4だけです。ダムの解決策は、配列を十分に大きくすることです。他の解決法:何らかのバランスを取る、またはバイナリ検索ツリー(効率的ではないが、動作することが保証される)になるための '配列 'のソート。 'array'はソートされていますか? – Poohl

+0

私はちょうど私のプログラムをデバッグし、あなたが何を言っているかを見ます。いいえ、配列はソートされません。私の教授は、配列をソートしたくないと述べました。申し訳ありませんが、私は何かを言及することを忘れていました:ノードに左と右の子がない場合、対応する位置は-1になります。私は前者をする必要があるので、配列を大きくする必要がありますか? – Jen

関連する問題