public static BinaryNode Balance(BinaryNode node) // балансировка узла node { BinaryNode.FixHeight(node); if (BinaryNode.BFactor(node) == 2) { //Console.WriteLine("Balance -> BinaryNode.BFactor(node) == 2"); if (BinaryNode.BFactor(node.Right) < 0) { // Console.WriteLine("RotateRight"); node.Right = RotateRight(node.Right); } //Console.WriteLine("RotateLeft"); return(RotateLeft(node)); } if (BinaryNode.BFactor(node) == -2) { //Console.WriteLine("Balance -> BinaryNode.BFactor(node) == -2"); if (BinaryNode.BFactor(node.Left) > 0) { node.Left = RotateLeft(node.Left); } return(RotateRight(node)); } //Console.WriteLine("Balance -> return node"); return(node); // балансировка не нужна }
public static BinaryNode RotateLeft(BinaryNode node) // левый поворот вокруг node { BinaryNode tmp = node.Right; node.Right = tmp.Left; tmp.Left = node; BinaryNode.FixHeight(node); BinaryNode.FixHeight(tmp); return(tmp); }