Tree Families

TreeGeometryBuilderNeedsDeterministicUse when
TwoNTreeaxis-aligned boxes, $2^n$ childrenTwoNTreeBuilder—yesgrid-like geometry; protrusion control matters (e.g. BEAST basis functions)
BoundingBallTreebounding ballsBoundingBallTreeBuilder—depends on splittergeneric clustering with a custom splitter
KMeansTreeballs from k-means clustersKMeansTreeBuilderParallelKMeans.jlyes (seeded rng by default)irregular point clouds without grid structure
MetisTreeballs from graph partitionsMetisTreeBuilderMetis.jlyesmesh/graph connectivity should drive clustering
MetisForestone MetisTree per componentMetisForestBuilderMetis.jlyesdisconnected geometry (e.g. multiple bodies)
SimpleHybridTreewraps a TwoNTree, splits upper/lower levelsSimpleHybridTreeBuilder—yesdifferent treatment above/below a chosen level
BlockTreea pair of trees (test + trial)BlockTreeBuilder—yesPetrov-Galerkin, test space ≠ trial space — see BlockTree and Petrov Trees

All builders are constructed through buildtree/buildforest — see Builder Workflow.

Box vs. ball clustering

The same points, split into boxes (TwoNTree, pink) and balls (KMeansTree, blue) at the same level:

using CompScienceMeshes, PlotlyJS, BEAST
using H2Trees
using ParallelKMeans

m = meshsphere(1.0, 0.1)
boxtree = TwoNTree(lagrangecxd0(m); builder=TwoNTreeBuilder(; minhalfsize=0.1, minvalues=0))
balltree = KMeansTree(
    lagrangecxd0(m); builder=KMeansTreeBuilder(; numberofclusters=4, minvalues=60)
)