2017-09-23 12 views
1

JavaでAVLツリーを作成しようとしていますが、これを2泊続けています。次のコードを実行すると、確実にローテーションが実行されますが、たとえばleftRotateという最終結果は、ノードを失っていることです。AVLツリーノードを回転するとノードが消えます

public AVLNode leftRotate(AVLNode node){ //receives the grandparent node 
    AVLNode temp = node.right; 
    node.right = temp.left; 
    temp.left = node; 

    return temp;  
} 

public AVLNode rightRotate(AVLNode node){ 
    AVLNode temp = node.left; 
    node.left = temp.right; 
    temp.right = node; 

    return temp; 
} 

public AVLNode rightLeftRotate(AVLNode node){ 
    node.right = rightRotate(node.right); 
    return leftRotate(node); 
} 

public AVLNode leftRightRotate(AVLNode node){ 
    node.left = leftRotate(node.left); 
    return rightRotate(node); 
} 

私は左右の回転方法にroot = tempを追加する場合は、回転して、新しいディスプレイは、まず周りに行くと、物事はすべてが混ざってもらうだけのために成功裏に行われます。

例:4,5、および6を挿入します。tempは、 "root"として5を保持します.4と6は、その左右の子のキーとして正しく含まれています。しかし、メソッドの終了後、これはすべて消え、ツリーのルートの左と右の子はnullになります。

私はそれが私が行方不明であることを知っていますが、私はそれの周りに私の頭を包むことはできません。

私もaddNodeの機能ではないことは知っています。すべてのノードの追加が終了した時点で、結果のツリーはバイナリ検索ツリーになります。これらの関数を呼び出してノードを失い始めるときだけです。どんな助け?

+0

https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Oleg

答えて

0

AVLNode temp = node.left; or AVLNode temp = node.left;の代わりに新しいAVLNodeをインスタンス化して情報をコピーするので、以前のオブジェクトへのポインタを持たないように、メモリの管理方法の問題があると思います。 何が起こっているかは、AVLNode temp = node.left; tempはnode.leftへのポインタです。したがって、tempを返すと、すべての変更と回転が元のノードに行われます。

関連する問題