// rotateLeft performs a left rotation around the node. func (tc *treeContext) rotateLeft(node *proto.RangeTreeNode) (*proto.RangeTreeNode, error) { right, err := tc.getNode(node.RightKey) if err != nil { return nil, err } if right.Black { return nil, util.Error("rotating a black node") } node.RightKey = right.LeftKey right.LeftKey = &node.Key right.Black = node.Black node.Black = false tc.setNode(node) tc.setNode(right) return right, nil }
// insert performs the insertion of a new range into the RangeTree. It will // recursively call insert until it finds the correct location. It will not // overwrite an already existing key, but that case should not occur. func (tc *treeContext) insert(node *proto.RangeTreeNode, key proto.Key) (*proto.RangeTreeNode, error) { if node == nil { // Insert the new node here. node = &proto.RangeTreeNode{ Key: key, } tc.setNode(node) } else if key.Less(node.Key) { // Walk down the tree to the left. left, err := tc.getNode(node.LeftKey) if err != nil { return nil, err } left, err = tc.insert(left, key) if err != nil { return nil, err } if node.LeftKey == nil || !(*node.LeftKey).Equal(left.Key) { node.LeftKey = &left.Key tc.setNode(node) } } else { // Walk down the tree to the right. right, err := tc.getNode(node.RightKey) if err != nil { return nil, err } right, err = tc.insert(right, key) if err != nil { return nil, err } if node.RightKey == nil || !(*node.RightKey).Equal(right.Key) { node.RightKey = &right.Key tc.setNode(node) } } return tc.walkUpRot23(node) }
// rotateLeft performs a left rotation around the node. func (tc *treeContext) rotateLeft(node *proto.RangeTreeNode) (*proto.RangeTreeNode, error) { right, err := tc.getNode(node.RightKey) if err != nil { return nil, err } right, err = tc.replaceNode(node, right) if err != nil { return nil, err } node.RightKey = right.LeftKey if right.LeftKey != nil { rightLeft, err := tc.getNode(right.LeftKey) if err != nil { return nil, err } rightLeft.ParentKey = node.Key tc.setNode(rightLeft) } right.LeftKey = node.Key node.ParentKey = right.Key tc.setNode(right) tc.setNode(node) return right, nil }