// rotateRight performs a right rotation around the node. func (tc *treeContext) rotateRight(node *proto.RangeTreeNode) (*proto.RangeTreeNode, error) { left, err := tc.getNode(node.LeftKey) if err != nil { return nil, err } if left.Black { return nil, util.Error("rotating a black node") } node.LeftKey = left.RightKey left.RightKey = &node.Key left.Black = node.Black node.Black = false tc.setNode(node) tc.setNode(left) return left, 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) }
// rotateRight performs a right rotation around the node. func (tc *treeContext) rotateRight(node *proto.RangeTreeNode) (*proto.RangeTreeNode, error) { left, err := tc.getNode(node.LeftKey) if err != nil { return nil, err } left, err = tc.replaceNode(node, left) if err != nil { return nil, err } node.LeftKey = left.RightKey if left.RightKey != nil { leftRight, err := tc.getNode(left.RightKey) if err != nil { return nil, err } leftRight.ParentKey = node.Key tc.setNode(leftRight) } left.RightKey = node.Key node.ParentKey = left.Key tc.setNode(left) tc.setNode(node) return left, nil }