"""
你需要采用前序遍历的方式，将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:
输入: 二叉树: [1,2,3,4]
       1
     /   \
    2     3
   /
  4

输出: "1(2(4))(3)"

解释: 原本将是“1(2(4)())(3())”，
在你省略所有不必要的空括号对之后，
它将是“1(2(4))(3)”。

示例 2:
输入: 二叉树: [1,2,3,null,4]
       1
     /   \
    2     3
     \
      4

输出: "1(2()(4))(3)"
解释: 和第一个示例相似，
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。



"""


""" 
递归
"""
class Solution:
    def tree2str(self, t: TreeNode) -> str:
        def func(node):
            if not node:
                return '()'
            l = func(node.left)
            r = func(node.right)
            if l == r == '()':
                return '(' + str(node.val) + ')'
            elif l != '()' and r == '()':
                return '(' + str(node.val) + l + ')'
            else:
                return '(' + str(node.val) + l + r + ')'

        return func(t)[1:-1]#去除第一个和最后一个括号





d04652e6ab6603be86e1d9950edb7ae9e1e0b662
<mask token>

<mask token>


class Solution:
    <mask token>

<mask token>


class Solution:

    def tree2str(self, t: TreeNode) ->str:

        def func(node):
            if not node:
                return '()'
            l = func(node.left)
            r = func(node.right)
            if l == r == '()':
                return '(' + str(node.val) + ')'
            elif l != '()' and r == '()':
                return '(' + str(node.val) + l + ')'
            else:
                return '(' + str(node.val) + l + r + ')'
        return func(t)[1:-1]

"""
你需要采用前序遍历的方式，将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:
输入: 二叉树: [1,2,3,4]
       1
     /   \
    2     3
   /
  4

输出: "1(2(4))(3)"

解释: 原本将是“1(2(4)())(3())”，
在你省略所有不必要的空括号对之后，
它将是“1(2(4))(3)”。

示例 2:
输入: 二叉树: [1,2,3,null,4]
       1
     /   \
    2     3
     \
      4

输出: "1(2()(4))(3)"
解释: 和第一个示例相似，
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。



"""


""" 
递归
"""
class Solution:
    def tree2str(self, t: TreeNode) -> str:
        def func(node):
            if not node:
                return '()'
            l = func(node.left)
            r = func(node.right)
            if l == r == '()':
                return '(' + str(node.val) + ')'
            elif l != '()' and r == '()':
                return '(' + str(node.val) + l + ')'
            else:
                return '(' + str(node.val) + l + r + ')'

        return func(t)[1:-1]#去除第一个和最后一个括号




