void rebalance(BTPosition& z) { // rebalancing utility while (!T.isRoot(z)) { // rebalance up to root z = T.parent(z); setHeight(z); // compute new height if (!isBalanced(z)) { // restructuring needed BTPosition x = tallGrandchild(z); z = T.restructure(x); // trinode restructure setHeight(T.leftChild(z)); // update heights setHeight(T.rightChild(z)); setHeight(z); } } }