For algorithmic processing of that string, I'm not sure, for just that one case, you can likely start with this simple expression,
([A-Z]+\s+\d+)\s+and\s+\(([A-Z]+\s+\d+)\s+or\s+([A-Z]+\s+\d+)\)
and replace it with something similar to:
X\n /\\\n \1 ()\n / - \\\n \2 \3
Test
import re
regex = r"([A-Z]+\s+\d+)\s+and\s+\(([A-Z]+\s+\d+)\s+or\s+([A-Z]+\s+\d+)\)"
string = "SU 3180 and (CMG 3200 or SU 3210)"
subst = ' X\\n /\\\\\\n \\1 ()\\n / - \\\\\\n \\2 \\3'
print(re.sub(regex, subst, string))
Output
X
/\
SU 3180 ()
/ - \
CMG 3200 SU 3210
If you wish to simplify/modify/explore the expression, it's been explained on the top right panel of regex101.com. If you'd like, you can also watch in this link, how it would match against some sample inputs.
A bit more complex expression that you can start with could be using (?R)
to check for balanced brackets, then capture what is before and after brackets, level by level (depth), pass it through a for loop, and based on that design some methods to print the tree level by level, which is pretty complicated:
(?>([^(]*?)\s*([(]([^()]*|(?R))*[)])([^)]*?)\s*)
or
([^(]*?)\s*([(]([^()]*|(?R))*[)])([^)]*?)\s*
Reference
Regular expression to match balanced parentheses