一、题目描述
给你二叉树的根节点 root
,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
空节点使用一对空括号对 "()"
表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 1:
输入:root = [1,2,3,4] 输出:"1(2(4))(3)" 解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。
示例 2:
输入:root = [1,2,3,null,4] 输出:"1(2()(4))(3)" 解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。
提示:
- 树中节点的数目范围是
[1, 10^4]
-1000 <= Node.val <= 1000
二、解题思路
- 如果根节点为空,直接返回空字符串。
- 如果根节点不为空,首先将根节点的值转换为字符串。
- 接下来,递归地转换左子树和右子树。对于左子树,如果它不为空,我们需要将其转换为字符串,并在其前后加上括号;如果左子树为空,但右子树不为空,我们需要添加一对空括号表示左子树。
- 对于右子树,如果它不为空,我们同样需要将其转换为字符串,并在其前后加上括号;如果右子树为空,我们不需要做任何操作。
- 将上述步骤得到的结果拼接起来,得到最终的字符串。
三、具体代码
class Solution {public String tree2str(TreeNode root) {// 如果根节点为空,返回空字符串if (root == null) {return "";}// 将根节点的值转换为字符串String result = Integer.toString(root.val);// 如果左子树和右子树都为空,直接返回根节点的值if (root.left == null && root.right == null) {return result;}// 如果左子树不为空,递归转换左子树,并在其前后加上括号if (root.left != null) {result += "(" + tree2str(root.left) + ")";} else {// 如果左子树为空但右子树不为空,添加一对空括号result += "()";}// 如果右子树不为空,递归转换右子树,并在其前后加上括号if (root.right != null) {result += "(" + tree2str(root.right) + ")";}// 返回最终结果return result;}
}
这段代码实现了题目要求的前序遍历二叉树,并将其转换为特定格式的字符串。在递归过程中,我们根据左子树和右子树的存在情况,适当地添加括号,以确保字符串与原始二叉树之间的一对一映射关系。
四、时间复杂度和空间复杂度
1. 时间复杂度
tree2str
函数是递归的,它会对每个节点调用一次自身。- 对于每个节点,我们执行的操作包括:检查节点是否为空、转换为字符串、以及可能的字符串拼接操作。
- 字符串拼接操作的时间复杂度取决于字符串的长度。在最坏的情况下,每次拼接操作的时间复杂度是 O(n),其中 n 是拼接后字符串的长度。
- 因为每个节点最多被访问一次,并且字符串拼接操作是线性的,所以总的时间复杂度是 O(n),其中 n 是二叉树中所有节点的数量。
2. 空间复杂度
- 递归的深度取决于二叉树的高度,最坏情况下,二叉树可能退化成一条链,递归深度为 n,其中 n 是节点的数量。
- 每次递归调用都会在调用栈上占用一定的空间,这个空间是常数级别的,因为只存储了当前节点的信息。
- 除了递归栈空间,还需要考虑字符串拼接操作的空间。在最坏情况下,字符串拼接操作可能需要 O(n) 的空间,其中 n 是最终生成的字符串的长度。
- 因此,总的空间复杂度是 O(n),其中 n 是二叉树中所有节点的数量。
五、总结知识点
-
递归:
- 递归是一种编程技巧,它允许函数调用自身来解决问题。在这个例子中,
tree2str
函数递归地遍历二叉树,并在每个节点处生成字符串。
- 递归是一种编程技巧,它允许函数调用自身来解决问题。在这个例子中,
-
条件语句:
if
语句用于检查特定条件是否为真,并根据条件执行不同的代码块。在代码中,它用于检查节点是否为空,以及左右子树的存在情况。
-
字符串操作:
Integer.toString(root.val)
:将整数值转换为字符串。result += ...
:字符串拼接操作,将字符串连接起来。
-
类和对象:
TreeNode
类定义了二叉树节点的结构,包括节点值val
以及指向左右子节点的引用left
和right
。Solution
类定义了tree2str
方法,该方法接受一个TreeNode
类型的参数。
-
基础数据结构:
- 二叉树是一种基础的数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
-
方法重载:
TreeNode
类的构造函数使用了方法重载,提供了不同的构造方式来创建TreeNode
对象。
-
空指针检查:
- 在递归调用和字符串拼接之前,代码通过检查
null
来避免空指针异常。
- 在递归调用和字符串拼接之前,代码通过检查
-
递归终止条件:
- 当递归到达叶子节点的子节点(即
null
)时,递归终止,这是递归算法的一个重要部分。
- 当递归到达叶子节点的子节点(即
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。