2012-05-07 4 views
0

私はJavaで、最後の10ノードをプリントすることでバランスがとれたBST AVLを得ました。私のhack-y解決策は、ノードの数を知っていて、順序通りの探索の最後の10ノードから値を取得することでした。それは意図したとおりに動作していません。レコードはラストネームキー(重複レコードは保持されません)に格納され、各ノードのサイズのプリントアウトは0になります。 私のプリントアウトは、主に 'Z'という名前のものがあります。そして、それに26000という最初のレコードが含まれています。私はそれが木の不具合とは違って、私がプリントアウトを考案した方法の問題であると思っています(希望)。最後の10個のノードを印刷するよりエレガントな方法がありますか?これは私の今のエラーではありませんか、ツリーの回転に欠陥がある可能性がありますか?AVLバランスツリー - 最後の10ノードをプリント

順序どおりトラバース出力:(get関数を介してアクセス出力)

public void inOrder(Node x) 
{ 
    if (x == null) 
     return; //stops recursion when there is no Node 
    inOrder(x.left); //always traverse left first 
    inOrder(x.right); //traverse right 

    inOrderTraversalOutput += Integer.toString((size(x.left)) + 
(size(x.right))) + "\n"; 

    bstNodes++; 
    //total nodes - 17151 
    if (bstNodes > 17145) 
     lastnodes += x.val.toString() + "Node left size: " + 
size(x.left) + "\n" + "Node right size: " + size(x.right) + 
"\n" + "----------------------------------------------------\n"; 

} 
//modified to print total number of nodes 
public String getTraversal() 
{ 
    inOrderTraversalOutput += Integer.toString(bstNodes) + "\n"; 
    return inOrderTraversalOutput; 
} 

プット方法:

private Node put(Node x, Key key, Value val) 
{ 
    if (x == null) 
    { 
     return new Node(key, val, 0); 
    } 

    int cmp = key.compareTo(x.key); 

    if (cmp < 0) 
    { 
     x.left = put(x.left, key, val); 

     //AVL Balance 
     if ((size(x.left) - size(x.right)) >= 2) 
      { 
       if (x.key.compareTo(x.left.key) < 0) 
       { 
        x = rotateWithLeftsapling(x); 
       } else 
       { 
        x = doubleWithLeftsapling(x); 
       } 
     } 

    } else if (cmp > 0) 
    { 
     x.right = put(x.right, key, val); 

     //AVL Balance 
     if ((size(x.right) - size(x.left)) >= 2) 
     { 
      if (x.key.compareTo(x.right.key) > 0) 
      { 
       x = rotateWithRightsapling(x); 
      } else 
      { 
       x = doubleWithRightsapling(x); 
      } 
     } 
    } else 
    { 
     x.val = val; 
    } 

    x.N = size(x.left) + size(x.right); 
    return x; 
} 
(ルートノード、キーと値を渡す方法によっても呼ばれる)

答えて

1

あなたは、発注書の追跡をしているようです。 inorder(左)とinorder(右)の呼び出しの間に、すべての '作業'が順番に実行されます。私はあなたがこれを修正すれば、あなたは大丈夫だろうと思います。

そのままですが、です。ルートノードが実際に作業を行っているので、印刷すると思います。

関連する問題