私は学校のプロジェクト用にavlツリーを実装していて、自分自身が対称的な状況のためにほぼ同じコードを2回書いていることがわかりました。たとえば、この関数はツリーのバランスをとるために2つのノードのローテーションを実行します。句は、下位ノードが1以上の左の子であり、かつ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')':私はラムダが好きなので、ここで最初の提案ですか?また、 'calcd()'のペアのうちの1つだけが入れ替わっているのは意図的なのでしょうか? – MSalters
アクセスするメンバーを選択すると、[メンバーポインタ](http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members)のジョブのように見えます。 – Quentin
'calcd'は左または右の深さを' max( '左の深さ'、 '右の深さ' + 1)として計算します。子がスワップされたノードの深度を更新するために呼び出されます。 – saga