If you're having trouble understanding this, be sure to check the on-line PM lectures.
class PMQuadtree { class Node; // define this yourself; superclass for Gray and Black; // evan used an interface, but this is pseuedocode. White SingletonWhiteNode = new White(); class Gray extends Node { Node[] children; Rectangle[] regions; // a gray node is a partition //into 4 regions; these rects are those regions // parameters here are stuff like the geometry you're adding //and any other info you need on the stack Node add(Geometry g, ...) { if (g intersects regions[0]) children[0] = children[0].add(...) ... if (g intersects regions[3]) children[3] = children[3].add(...) } Node remove(Geometry g, ...) { if (g intersects regions[0]) children[0] = children[0].remove(...); ... if (g intersects regions[3]) children[3] = children[3].remove(...); if (all children are white) return SingletonWhiteNode; if (three children white, one child black) return the black child; if (not all children are gray) { Black b = new Black; add all geometry in this subtree into b; if (b is valid) return b; else { // this gray is still necessary, so keep it in the tree return this; } } } } class Black extends Node { List geometry; Node add(Geometry g, ...) { add g to geometry if (this node is valid) return this; else return partition(...); } Node remove(Geometry g, ...) { remove g from geometry if (geometry is empty) return SingletonWhiteNode; else return this; } Node partition(...) { Gray g = new Gray(...); for each item i in geometry { g.add(i); } return g; } } class White extends Node { Node add(Geometry g, ...) { return new Black(g); } Node remove(...) { error } } }