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を変更する関数を終了します。誰も助けることができますか?
一時的な変数がどこかに必要であると思われます。 –