题目
难度:★★☆☆☆
类型:二叉树
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例
示例 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)"
解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
解答
前序遍历是:每一个结点按照“根节点-左子树-右子树”的顺序进行遍历。构造递归函数(explore),这里需要考虑括号的问题:
如果输入结点为空,直接返回空字符串;
如果输入结点为叶子结点,直接返回该结点的值;
输入结点不为叶子结点:
(1)首先把该结点的值加入到结果字符串中;
(2)如果存在左子树,将左子树的前序遍历结果(递归调用本函数获取)用括号括起来加入结果字符串中,否则将一对空括号加入结果字符串中;
(3)如果存在右子树,将右子树的前序遍历结果(递归调用本函数获取)用括号括起来加入结果字符串中,否则不做任何操作。
class Solution(object):
def tree2str(self, t):
def explore(r): # 函数将一棵树转换为带括号的字符串
if not r: # 如果输入根节点为空
result = "" # 返回空字符串
elif not r.left and not r.right: # 如果输入根节点即为叶子结点
result = str(r.val) # 返回该根节点的值
else: # 如果该结点不是叶子结点
result = str(r.val) # 先把当前结点的值添加进去
# 如果存在左子树,则前序遍历左子树,并用括号括起来,否则在根节点后直接添加一对括号即可
result = result + "(" + explore(r.left) + ")" if r.left else result + '()'
# 如果存在右子树,则前序遍历右子树,并用括号括起来,否则不增加任何字符
result = result + "(" + explore(r.right) + ")" if r.right else result
return result # 返回最终结果
return explore(t) # 探索根节点,调用函数即可,该函数摆脱了self,可迁移到其他任务
如有疑问或建议,欢迎评论区留言~