docs: def write_as_dot(self, f, data=None, max_levels=None):
          "Write the tree in the dot language format to f."
          assert (max_levels is None) or (max_levels >= 0)
          def visit_node(n, levels):
              lbl = "{"
              if data is None:
                  if self.k <= max_k_labeled:
                      lbl = repr(n.label()).\
                            replace("{","\{").\
                            replace("}","\}").\
                            replace("|","\|").\
                            replace("<","\<").\
                            replace(">","\>")
                  else:
                      lbl = str(n)
              else:
                  s = self.bucket_to_block(n.bucket)
                  for i in xrange(self.blocks_per_bucket):
                      lbl += "{%s}" % (data[s+i])
                      if i + 1 != self.blocks_per_bucket:
                          lbl += "|"
              lbl += "}"
              f.write("  %s [penwidth=%s,label=\"%s\"];\n"
                      % (n.bucket, 1, lbl))
              levels += 1
              if (max_levels is None) or (levels <= max_levels):
                  for i in xrange(self.k):
                      cn = n.child_node(i)
                      if not self.is_nil_node(cn):
                          visit_node(cn, levels)
                          f.write("  %s -> %s ;\n" % (n.bucket, cn.bucket))
  
          f.write("// Created by SizedVirtualHeap.write_as_dot(...)\n")
          f.write("digraph heaptree {\n")
          f.write("node [shape=record]\n")
  
          if (max_levels is None) or (max_levels > 0):
              visit_node(self.root_node(), 1)
          f.write("}\n")