private void RotateLeft(TreeNode node, TraceNode parent) { var parentNode = parent.Node; parentNode.Right = node.Left; node.Left = parentNode; if (parent.Parent != null) { if (parent.Dir == Direction.Left) { parent.Parent.Left = node; } else { parent.Parent.Right = node; } } else // root { Root = node; } }
private void BalanceNode(TraceNode tn) { var curNode = tn.Node; var bf = GetBalanceFactor(curNode); if (bf == 2) { var left = curNode.Left; var sbf = GetBalanceFactor(left); if (sbf == -1) // left-right tree { RotateLeft(left.Right, new TraceNode() { Node = left, Parent = curNode, Dir = Direction.Right }); } // left-left tree RotateRight(left, tn); } else if (bf == -2) { var right = curNode.Right; var sbf = GetBalanceFactor(right); if (sbf == 1) // right-left tree { RotateRight(Root.Left.Left, new TraceNode() { Node = right, Parent = curNode, Dir = Direction.Left }); } // right-right tree RotateLeft(right, tn); } }