I ended up playing with the d3 force options a bit, and I came across this as a viable solution:
var force = d3.layout.force()
.linkDistance(function(d) {
return d.target._children ? d.target._children.length * 30 :
d.target.children ? d.target.children.length * 30 :
60;
})
.charge(-400)
.gravity(0.05)
.friction(0.45)
.linkStrength(0.6)
.size([width, height])
.on("tick", tick);
gravity
/ friction
/ linkStrength
are not necessary but make transitions overall smoother; having a very negative charge
was the key component to solving my original problem.
Much thanks to @AmeliaBR for pointing me in the right direction!