2012-04-07 28 views
1

AVLを実装しようとしています。ここに私の挿入、balance_tree、check_bf(バランス係数)だし、単一左の順で関数を回転させる:C++ AVLツリーの実装

1 <----t 
\ 
    2 
    \ 
    3 

時:私は、単一の左回転を必要とし、小さな木でそれを試してみた

BinaryNode *BinarySearchTree::insert(int x,BinaryNode *t, int dpt) throw(DuplicateItem) 
{ 
    if (t == NULL) t = new BinaryNode(x,NULL,NULL,dpt+1); 
    else if (x < t->element) t->left = insert(x, t->left, dpt+1); 
    else if (x > t->element) t->right = insert(x, t->right, dpt+1); 
    else 
     throw DuplicateItem(); 
    balance_tree(t); 
    return t; 
} 
BinaryNode* BinarySearchTree::balance_tree(BinaryNode *t) 
{ 
    double debug = check_BF(t); 
    while(check_BF(t)>1 || check_BF(t)<-1) 
    { 
     if(check_BF(t)>1) 
     { 
      if(check_BF(t->right)<-1) return doubleLeft(t); 
      else return singleLeft(t); 
     } 
     else if(check_BF(t)<-1) 
     { 
      if(check_BF(t->left)>1) return doubleRight(t); 
      else return singleRight(t); 
     } 
    } 
} 
double BinarySearchTree::check_BF(BinaryNode *t) 
{ 
    double l, r; 
    if(t->left!=NULL) l = t->height(t->left)+1; 
    else l=0; 

    if(t->right!=NULL) r = t->height(t->right)+1; 
    else r=0; 

    return r-l; 
} 
BinaryNode* BinarySearchTree::singleLeft(BinaryNode *t) 
{ 
    BinaryNode* Y = t; 
    if(Y!=NULL) 
    { 
     t = t->right; 
     Y->right = t->left; 
     t->left=Y; 
    } 
    return t; 
} 

単一の左回転関数の終わりであり、tは2を指し、左ノードとして1、右ノードとして3を有するので、関数は機能する。ツリーは次のようになります。

2<----t 
/\ 
1 3 

ただし、関数を終了すると、tは左または右のノードなしで1を指します。私は、戻り値tと右括弧の間に何が起こるか理解していません}、tを変更する関数を終了します。誰も助けることができますか?

+0

一時的な変数がどこかに必要であると思われます。 –

答えて

1

ここで欠落しているのは、テストで関数を呼び出す行です。私は、あなたはtは変わらないと言っていると聞いていると思いますが、t点が変わる節点は変わります。 t点(1)が変更されたノードが期待される動作であること。それは変わらないのは、あなたが期待していることではない。あなたのルーチンは値を返します。その値をtに代入しているのでしょうか、それとも単にルーチンによって変更されることを期待していますか?