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를 변경하는 함수를 끝낸다. 누구든지 도와 줄 수 있습니까?
어딘가에 임시 변수가 필요합니다. –