Como ves resulta bastante simple un arbol es una estructura recursiva por si misma; cada vez que  se procesa un nodo del arbol se hace lo propio para todos sus hijos...
 
Lo que nesesitarias adicionalmente es una clase de categorias q contenga los nodos q son raiz del arbol, es decir aquellos que no tienen padre... espero te sea util salu2   
 Código PHP:
     
 
 
class Arbol
{
  private $id;
  private $nombre;
  private $childs;    
 
 function __construct($id,$name)
 {
     $this->id=$id;
     $this->name=$name;
     $this->childs=array();
     $this->loadChilds();    
 }
 
 function loadChilds()
 {
    //obtener todos los hijos de este arbol
    $chils=this->obtenerHijos();
    
    foreach($childs as $child)
    {
       $ch=new Arbol($child['id'],$child['name']); //aca esta la llamada recursiva
       array_push($this->childs,$ch);
    }    
 
 } 
 
 
 
 function obtenerHijos()
 {
 
    //busca en la base de datos todos los registros con
        //id_padre igual a $this->id 
        //retorna un array de objetos [{id,name}]
 
 }
 
 
}