public String allTreeValuesToString() throws MiniDB_Exception{
    String s = "";
    int level = 0;
    Vector vNodesInCurrLevel = new Vector();
    Vector vNodesInNextLevel;

    vNodesInCurrLevel.add(getRootNode());
    boolean atLeaf = false;
    BPlusTreeNode currNode = null;

    while(!atLeaf){
      vNodesInNextLevel = new Vector();
      s += "Level " + level + "\n";

      //System.out.println( "Level " + level + "\n" );

      for (int i=0; i<vNodesInCurrLevel.size(); i++){
	currNode = ((BPlusTreeNode)vNodesInCurrLevel.get(i));
	
	s += currNode.recordsToString() + "\n";
	
	if( currNode.isLeafNode() ){
	  atLeaf = true;
	}
	else{
	  Vector children = ((BPlusTreeInternalNode)currNode).children();
	  for (int cIdx=0; cIdx<children.size(); cIdx++){
	    int childBlockID = ((Integer)children.get(cIdx)).intValue();
	    //System.out.println( "Child Block is " + childBlockID );

	    MiniDB_Block blk = miniDB.bufMgr.pin_block(childBlockID);
	    BPlusTreeNode childNode = null;

	    if( blk.getBlockType() == MiniDB_Block.BLOCK_TYPE_BPT_LEAF ){
	      boolean isNewNode = false;
	      //System.out.println( "Child Block is " + childBlockID );
	      childNode = new BPlusTreeLeafNode(blk,this,false);
	    }
	    else{
	      assert( blk.getBlockType() == MiniDB_Block.BLOCK_TYPE_BPT_INTERNAL );
	      childNode = new BPlusTreeInternalNode(blk,this);
	    }

	    vNodesInNextLevel.add( childNode );
	    //System.out.println( "size of next level list = " + vNodesInNextLevel.size() );
	  }
	}

	miniDB.bufMgr.unpin_block( currNode.getThisBlockID() );
      }

      vNodesInCurrLevel = vNodesInNextLevel;
      s += "\n";

      level++;
    }

    return s;
  }