我正在为我的学校项目实施avl树,发现自己为对称情况编写两次几乎相同的代码。例如,此功能执行两个节点的旋转来平衡树。如果条款处理中下级节点是更高一个的左子的情况下,和else子句处理相反:是否可以组合对称代码段?
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');
}
}
正如你所看到的,else子句是完全类似于“L if子句'和'r'交换。有没有办法将它们结合起来。我能做些什么来改进它?我的代码中是否有一些设计错误?
'Y->计算( 'L')' - 让我猜,有一个'如果(ARG == 'L')'测试藏身在那里?另外,是否只有一个'calcd()'对被交换? – MSalters
选择要访问的成员看起来像[成员指针]的作业(http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members)。 – Quentin
'calcd'计算左或右深度为'max('孩子的左侧深度','右侧深度')+ 1'。它被调用来更新有孩子交换的节点的深度。 – saga