// 두 서브 트리의 높이의 차(균형 인수)를 반환
intGetHeightDiff(BTreeNode * bst)
{
int lsh; // left sub tree height
int rsh; // right sub tree height
if(bst == NULL)
return0;
lsh = GetHeight(GetLeftSubTree(bst));
rsh = GetHeight(GetRightSubTree(bst));
return lsh - rsh;
}
// 트리의 높이를 계산하여 반혼
intGetHeight(BTreeNode * bst)
{
int leftH; // left height
int rightH; // right height
if(bst == NULL)
return0;
leftH = GetHeight(GetLeftSubTree(bst));
rightH = GetHeight(GetRightSubTree(bst));
// 큰 값의 높이를 반환한다.
if(leftH > rightH) // 높이가 작은 값 버림
return leftH +1;
elsereturn rightH +1;
}
BTreeNode *Rebalance(BTreeNode ** pRoot) // 상황에 따른 적절한 함수 실행
{
int hDiff = GetHeightDiff(*pRoot); // 균형 인수 계산
// 균형 인수가 +2 이상이면 왼쪽으로 길게 불균형이므로 LL 또는 LR상태
if(hDiff >1) // 왼쪽 서브트리 방향 높이가 2이상 크다면
{
if(GetHeightDiff(GetLeftSubTree(*pRoot))>0)
*pRoot = RotateLL(*pRoot);
else*pRoot = RotateLR(*pRoot);
}
// 균형 인수가 -2 이하면 오른쪽으로 길계 불균형이므로 RR 또는 RL상태
if(hDiff <-1) // 오른쪽 서브트리 방향으로 2 이상 크다면
{
if(GetHeightDiff(GetRightSubTree(*pRoot)) <0)
*pRoot = RotateRR(*pRoot);
else*pRoot = RotateRL(*pRoot);
}
return*pRoot;
}
BSTInsert 함수의 마지막 부분에서 루트 노드를 기준으로 리밸런싱의 필요성을 판단하고 리밸런싱 진행 → 하위 노드 기준으로는 불균형이 또 일어날 수 있다.