我正在爲我的學校項目實施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