Is a depth-first search not enough? According to the wiki, GetJoints will parts connected via joints and constrains, which is better than just checking for any child constraints.
Edit: Okay, this is confusing. According to the wiki, GetJoints() “Return all Joints or Constraints that is connected to this Part.”. but its return type is array<BasePart>. Hmmm…