2011-12-10 5 views
0

現在、ランダムな0と1からなる文字列のarrayListで作成されたツリーを刺激するプログラムに取り組んでいます。 各ノードに格納できる値の上限とルート常に最初のnode.size値で満たされます。その後の値は、左または右の子に移動する必要があります(0または1の値に応じて異なります)。0 =左1 =右。ツリーが成長すると、各レベルはツリーの高さのインデックスで評価されます。arrayListツリーのソートとバイナリコードの文字列の追加

ノードクラス

public class Node { 
    public ArrayList<String> elements; 
    public Node leftC; 
    public Node rightC; 
    private String data; 
    int size = 5; //size limit of the Arraylist in each node 


    public Node(s){ 
     elements = new ArrayList<String>(); 
     elements.add(s); 
    } 

    public void addString(String s){ 
     elements.add(s); 
    } 
} 

Treeクラス

public void insert(String s){ 

    root = insert(root,s); 
} 
private Node insert(Node n, String s){ 

    if (n == null){ 
     n = new Node(s); 
    } else if (!n.isFull()){ 
     n.addString(s); 
    } else { 
     if (s.charAt(0) == '0'){ 
      n.leftC = insert(n.leftC,s); 
     } else if (s.charAt(0) == '1'){ 
      n.rightC = insert(n.rightC,s); 
     } 
    } 
    return (n); 
} 

編集: 私はアドバイスを取り、これを行うには再帰関数を実装し、入力いただきありがとうございます。 ツリーは、ソートの今働いている...それは適切にArrayListに最初Node.size値を追加し、そこに残りの部分を送信します0または1

Example: 
Root node: 
[1011001001, 1011101101, 1111011011, 1011011101, 0101111011] 

Left Child Node [0111001000, 0111111111, 0010101010, 0100000000, 0011010000] 
Right Child Node [1111011111, 1011010110, 1001101000, 1000001110, 1110000000] 

に基づいて子どもたち、私が実行しているが、これは、新しい問題に、私は完全に立ち往生している。

私はこれらの新しいノードのLとRの子を評価するために行けば...それはのcharAtインデックス0の値を評価し続けているため、それが唯一の三角形の木

right child @ right [1100000011, 1100000000, 1011100000, 1011011011, 1010101010] 
left child @ right - none 
right child @ left - none 
left child @ left [0010010101, 0010101011, 0110000100, 0011000000, 0010110111] 

に私の質問を作っているようです私は木の高さに関連して評価されるcharAtインデックスを作成するにはどうすればいいですか?例えば

..私のツリーは次のようになり最初の後に正しくノードの次の層を行われていた場合、我々は進むと木がでいっぱいになるように

right child @ right [1100000011, 1100000000] 
left child @ right [1011100000] 

right child @ left [0110000100, 0111001000] 
left child @ left [0010010101, 0010101011, 0011000000,0010110111,0001110000] 

(のcharAtインデックス1ではなく0を評価します)各ノードでは、@ 3番目のインデックスなどを評価します。 これを実装する方法がわかりません。

+0

この質問とコードを調べることは本当に面倒です。 http://sscce.org/ – bragboy

+0

から提案された基準から質問をしてください。問題はないようですが、 'size' * final *を実行すると誤ってその値を変更する可能性がなくなります。 –

+0

Tree.treeInsertにすべてのロジックを持つべきではありません。ルートノードの作成以外は、Node.addString内にすべて存在する必要があります。 addStringに追加のパラメータで深さを伝えることができます。 –

答えて

0

基本的な問題は、左または右のパスを選択した後でrunnerを適切な左または右のノードに設定しないことです。特に

、このコード:

  } else if (runner.leftC==null){ 
       runner.leftC = new Node(); 
       runner.addString(s); 
       System.out.println("ADDED "+s+" to step 2 LEFT"); 
       return; 
      } 

あなたが対1だけで作成したため、前のノードに文字列を追加しています。

ノードで再帰的メソッドを使用した場合、このエラーは起きません。

0

「ステップ2」の文字列が追加されているのは、似ていない2つ(010110010001 & 110100111111)なので、そこに問題がなければなりません。その様子から、

は、あなたが「ルート」に「ランナー」を設定している:

Node runner; 
runner = root; 

そしてあなたは、文字列を追加している:

runner.leftC = new Node(); 
runner.addString(s); 

何が起こっている、 "ですランナー "はまだこの時点で" root "に等しいので、要素がルートに追加されています。

関連する問題