0001 auto TallerChild = [](auto x) { //在左、右孩子中取更高者 0002 return 0 < BalFac(x) ? x->lc : //左高 0003 BalFac(x) < 0 ? x->rc : //右高 0004 x == x->parent->lc ? x->lc : x->rc; //等高时(x只可能是p),取与x同侧者 0005 }; //TallerChild 0006 template <typename T, bool H> BNP<T> BST<T, H>::rotate(BNP<T> g) { //g->height > 1 0007 BNP<T> p = TallerChild(g); int TurnP = (p == g->rc); 0008 BNP<T> v = TallerChild(p); int TurnV = (v == p->rc); 0009 BNP<T> r = (TurnP == TurnV) ? p : v; //子树新的根节点 0010 (FromParentTo(g) = r)->parent = g->parent; //须保持与母树的联接 0011 switch ((TurnP << 1) | TurnV) { //视p、v的拐向,无非四种情况 0012 case 0b00 : return connect342(v, v->rc, p, p->rc, g); //LL 0013 case 0b01 : return connect342(p, v->lc, v, v->rc, g); //LR 0014 case 0b10 : return connect342(g, v->lc, v, v->rc, p); //RL 0015 default/*0b11*/ : return connect342(g, p->lc, p, v->lc, v); //RR 0016 } //switch 0017 } //rotate