Assumes that there is no entry in edge_by_source[node_id] to clean up.

def _del_tip(self, node_id):
        """Assumes that there is no entry in edge_by_source[node_id] to clean up."""
        self.nodes_deleted.append(node_id)
        etp = self._edge_by_target.get(node_id)
        assert etp is not None
        source_id, target_id = self._del_edge(etp)
        assert target_id == node_id
        return source_id