private static StringRebuilder Pivot(StringRebuilder child, StringRebuilder other, bool deepOnRightSide) { Debug.Assert(child.Depth > 0); //child's depth is greater than other's depth. StringRebuilder grandchildOutside = child.Child(deepOnRightSide); StringRebuilder grandchildInside = child.Child(!deepOnRightSide); if (grandchildOutside.Depth >= grandchildInside.Depth) { //Simple pivot. //From this (case deepOnRightSide) // this // / \ // other child // ... / \ // gcI gcO // ... ... // //To this: // child' // / \ // this' gcO // / \ ... // other gcI StringRebuilder newThis; StringRebuilder newChild; if (deepOnRightSide) { newThis = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(other, grandchildInside); newChild = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(newThis, grandchildOutside); } else { newThis = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(grandchildInside, other); newChild = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(grandchildOutside, newThis); } return(newChild); } else { //Complex pivot. //From this (case !deepOnRightSide) // this // / \ // other child // ... / \ // gcI gcO // / \ ... // ggcI ggcO // ... ... // //To this: // gcI' // / \ // this' child' // / \ / \ // other ggcI ggcO gcO // ... ... ... ... Debug.Assert(grandchildInside.Depth > 0); //The inside's grandchild depth is > the outside grandchild's. StringRebuilder greatgrandchildOutside = grandchildInside.Child(deepOnRightSide); StringRebuilder greatgrandchildInside = grandchildInside.Child(!deepOnRightSide); StringRebuilder newThis; StringRebuilder newChild; StringRebuilder newGcI; if (deepOnRightSide) { newThis = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(other, greatgrandchildInside); newChild = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(greatgrandchildOutside, grandchildOutside); newGcI = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(newThis, newChild); } else { newThis = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(greatgrandchildInside, other); newChild = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(grandchildOutside, greatgrandchildOutside); newGcI = BinaryStringRebuilder.ConsolidateOrBalanceTreeNode(newChild, newThis); } return(newGcI); } }