Cancers are composed of multiple genetically distinct subpopulations of cancer cells. By performing genome sequencing on tissue samples from a cancer, we can infer the existence of these subpopulations, which mutations render them genetically unique, and the evolutionary relationships between subpopulations. This can reveal critical points in disease development and inform treatment. Here we present Pairtree, a new algorithm for constructing evolutionary trees that reveal relationships between genetically distinct cell subpopulations composing a patient's cancer. Pairtree focuses on performing these reconstructions using dozens of cancerous tissue samples per patient, which can be taken from different points in space (e.g., primary tumour and metastasis) or in time (e.g., at diagnosis and at relapse). In concert, these can reveal thirty or more distinct subpopulations, and show how their composition changed between tissue samples. Each additional tissue sample from a patient provides additional constraints on possible evolutionary histories, and so should aid construction of more accurate and precise results. Counterintuitively, we demonstrate using both simulated and real data that existing algorithms actually perform worse as additional tissue samples are provided, often failing to produce any result. Pairtree, conversely, efficiently leverages the information from additional samples to perform progressively better as samples are added. The algorithm's ability to function in these settings enables new biological and clinical applications, which we demonstrate using data from 14 acute lymphoblastic leukemia cancers, with dozens of tissue samples per cancer. Pairtree also produces a useful visual representation of the degree of support underlying evolutionary relationships present in the user's data, allowing users to make accurate inferences from its results.