目录
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)" 解释: 和第一个示例相似, 除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
2. 解题分析
用递归的方式实现前序遍历非常简单明了:
- (1) 访问根节点
- (2) 如果有左子节点的话,以左子节点为根递归调用
- (3) 如果有右子节点的话,以右子节点为根递归调用
但是本题有一些细微要求:
- 子树对应的字符串用()括起来。因此最终生成的字符串中包含多重嵌套的括号
- 叶子节点(即既没有左子节点也没有右子节点)后面不用跟括号,属于多余的空括号对
- 当一个节点有左子节点但是没有右子节点,代表空右子树的空括号对不需要
- 当一个节点没有左子节点但是有右子节点,代表空左子树的空括号对不能省
3. 代码实现
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def tree2str(self, root: Optional[TreeNode]) -> str:
if root == None:
return ''
ans = str(root.val)
if root.left == None and root.right == None:
return ans
if root.left == None:
ans = ans + '()'
else:
ans = ans + '(' + self.tree2str(root.left) + ')'
if root.right != None:
ans = ans + '(' + self.tree2str(root.right) + ')'
return ans
输入是像[1,2,3,null,4]这样的表现形式,所以对以上代码的测试需要先将输入数据转换成树的形式。隔离在家用笔记本直接在网页上编辑,太麻烦了,暂时省略^-^
回到主目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)https://chenxiaoyuan.blog.csdn.net/article/details/123040889