https://leetcode-cn.com/problems/construct-string-from-binary-tree/
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 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)"
解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
- DFS
- 暂无
本题的关键是理解什么是可以省略的括号。
由于是前序遍历,因此最终生成的结果可以表示为 CLR,其中 C 为当前节点,L 为左子树结果,R 为右子树结果。
而什么情况是可以省略的呢?我们不妨思考什么是不可省略的。
对于 CLR,如果 L 是空的,括号可以省略么?如果省略了,我们如何知道 LR 的分界点?也就是哪部分是左子树,哪部分是右子树?答案不行。
类似地,如果 R 是空的,括号可以省略么?如果省略了,不影响我们可以找到分界点,那就是和 C 右侧左括号匹配的右括号是分界点。
进一步如果 L 和 R 都空,正常序列化为 "()",但是我可以序列化为 "",因为在这种情况不存在一种其他可能使得其序列化结果为 "()"。
- 理解什么是可以省略的括号
- 语言支持:Python3
Python3 Code:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def tree2str(self, root: TreeNode) -> str:
if not root: return ''
ans = str(root.val)
l = self.tree2str(root.left)
r = self.tree2str(root.right)
if l or r: ans += '(' + l + ')'
if r: ans += '(' + r + ')'
return ans
复杂度分析
令 n 为数组长度。
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$
- 构造二叉树系列 核心也是搞明白左右子树的分界点。
此题解由 力扣刷题插件 自动生成。
力扣的小伙伴可以关注我,这样就会第一时间收到我的动态啦~
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。