학교 프로젝트를위한 avl 트리를 구현하면서 대칭 상황에서 거의 동일한 코드를 두 번 쓰는 것을 발견했습니다. 예를 들어,이 함수는 두 노드의 회전을 수행하여 트리의 균형을 조정합니다. 절은 낮은 노드가 높은 하나의 왼쪽 자식 인 경우를 처리하고 다른 절 반대 처리하는 경우 :대칭 코드 조각을 결합 할 수 있습니까?
void avl<T>::rotate(node<T> *x, node<T> *y)
{
if (x == y->l)
{
x->p = y->p;
if (y->p != nullptr)
if(y->p->l == y)
y->p->l = x;
else
y->p->r = x;
else
this->setHead(x);
y->p = x;
y->l = x->r;
if(x->r != nullptr)
x->r->p = y;
x->r = y;
y->dl = y->calcd('l');
x->dr = x->calcd('r');
if(x->p != nullptr)
if(x->p->l == x)
x->p->dl = x->p->calcd('l');
else
x->p->dr = x->p->calcd('r');
}
else
{
x->p = y->p;
if (y->p != nullptr)
if(y->p->r == y)
y->p->r = x;
else
y->p->l = x;
else
this->setHead(x);
y->p = x;
y->r = x->l;
if(x->l != nullptr)
x->l->p = y;
x->l = y;
y->dl = y->calcd('l');
x->dr = x->calcd('r');
if(x->p != nullptr)
if(x->p->r == x)
x->p->dr = x->p->calcd('r');
else
x->p->dl = x->p->calcd('l');
}
}
을 당신이 볼 수 있듯이, 다른 절은 'L로하면 절에 정확하게 유사하다 '와'r '이 바뀌었다. 그들을 결합하는 방법이 있습니까? 이 문제를 개선하기 위해 무엇을 할 수 있습니까? 내 코드에서 디자인 실수가 있습니까? 컴퓨터 과학
'y 축>에 대한 계산치 ('L')'-'(인수 == 'L')의 경우'테스트 숨어 거기에있다, 내가 맞춰 볼까? 또한,'calcd()'쌍 중 하나만 바꾼다는 것이 의도적인가? – MSalters
액세스 할 멤버를 선택하면 [멤버 포인터] (http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members)의 작업처럼 보입니다. – Quentin
'calcd'는 왼쪽 또는 오른쪽의 깊이를'max ('왼쪽 깊이)', 'right depth of child'+ 1'로 계산합니다. 자식을 스왑 한 노드의 깊이를 업데이트하기 위해 호출됩니다. – saga