if(!$node['parent']) {
$tree[$id] = &$node;
}
если у текущего элемента нет предка, значит, вы помещаете текущий элемент в $tree по ссылке. То есть, изменение этого элемента в $tree повлияет на $dataset и наоборот, изменив этот элемент в dataset вы измените tree.
рекомендую заменить первую строку в фрагменте кода, который я выделил, на
if(!isset($node['parent'])) {
далее:
$dataset[$node['parent']]['childs'][$id] = &$node;
если предок есть (то есть, это не рутовый элемент), вы добавляете в изначальный dataset информацию о том, что у его элемента, идентификатор которого равен предку текущего элемента, есть child, и заносите туда текущий элемент. Поскольку перед этим вы сохранили в tree элемент node по ссылке, то эта операция также изменит и структуру переменной tree.
Обратите внимание, что, убрав & из выделенного фрагмента, вы получите тот же результат, что и с ним.