func (t *Tree) deletePrefix(parent, n *node, prefix string) int {
	// Check for key exhaustion
	if len(prefix) == 0 {
		// Remove the leaf node
		subTreeSize := 0
		//recursively walk from all edges of the node to be deleted
		recursiveWalk(n, func(s string, v interface{}) bool {
			subTreeSize++
			return false
		})
		if n.isLeaf() {
			n.leaf = nil
		}
		n.edges = nil // deletes the entire subtree

		// Check if we should merge the parent's other child
		if parent != nil && parent != t.root && len(parent.edges) == 1 && !parent.isLeaf() {
			parent.mergeChild()
		}
		t.size -= subTreeSize
		return subTreeSize
	}

	// Look for an edge
	label := prefix[0]
	child := n.getEdge(label)
	if child == nil || (!strings.HasPrefix(child.prefix, prefix) && !strings.HasPrefix(prefix, child.prefix)) {
		return 0
	}

	// Consume the search prefix
	if len(child.prefix) > len(prefix) {
		prefix = prefix[len(prefix):]
	} else {
		prefix = prefix[len(child.prefix):]
	}
	return t.deletePrefix(n, child, prefix)
}
func (t *Tree) deletePrefix(parent, n *node, prefix string) int {
	
	if len(prefix) == 0 {
		
		subTreeSize := 0
		
		recursiveWalk(n, func(s string, v interface{}) bool {
			subTreeSize++
			return false
		})
		if n.isLeaf() {
			n.leaf = nil
		}
		n.edges = nil 

		
		if parent != nil && parent != t.root && len(parent.edges) == 1 && !parent.isLeaf() {
			parent.mergeChild()
		}
		t.size -= subTreeSize
		return subTreeSize
	}

	
	label := prefix[0]
	child := n.getEdge(label)
	if child == nil || (!strings.HasPrefix(child.prefix, prefix) && !strings.HasPrefix(prefix, child.prefix)) {
		return 0
	}

	
	if len(child.prefix) > len(prefix) {
		prefix = prefix[len(prefix):]
	} else {
		prefix = prefix[len(child.prefix):]
	}
	return t.deletePrefix(n, child, prefix)
}
func ( t * Tree ) deletePrefix ( parent , n * node , prefix string ) int { // Check for key exhaustion if len ( prefix ) == 0 { // Remove the leaf node subTreeSize := 0 //recursively walk from all edges of the node to be deleted recursiveWalk ( n , func ( s string , v interface { } ) bool { subTreeSize ++ return false } ) if n . isLeaf ( ) { n . leaf = nil } n . edges = nil // deletes the entire subtree // Check if we should merge the parent's other child if parent != nil && parent != t . root && len ( parent . edges ) == 1 && ! parent . isLeaf ( ) { parent . mergeChild ( ) } t . size -= subTreeSize return subTreeSize } // Look for an edge label := prefix [ 0 ] child := n . getEdge ( label ) if child == nil || ( ! strings . HasPrefix ( child . prefix , prefix ) && ! strings . HasPrefix ( prefix , child . prefix ) ) { return 0 } // Consume the search prefix if len ( child . prefix ) > len ( prefix ) { prefix = prefix [ len ( prefix ) : ] } else { prefix = prefix [ len ( child . prefix ) : ] } return t . deletePrefix ( n , child , prefix ) }
// delete does a recursive deletion
delete does a recursive deletion