题目描述
-
根据二叉树创建字符串
给你二叉树的根节点 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, 104] -1000 <= Node.val <= 1000
解题思路
法1
方法1:递归
-
我们使用递归的方法调用函数对二叉树进行中序遍历 -
在开始一个节点之前加'('节点之后加')'这样就实现了括号的加入 -
注意特殊情况:存在不必要的括号时需要删除括号
-
该节点为右节点,并且为空值时则不需要括号(左节点的空值而右节点有值需要括号来判断该左节点为空)
所以我们需要加多一个判断,就是在遍历右节点的时候判断右节点是否为空,如果是则不遍历
-
时间复杂度(O(n)) -
空间复杂度(O(n))
执行结果
法1
根据当前节点的左右子树是否为空,来决定输出的括号是否省略。具体来说,如果当前节点的左右子树都为空,则直接返回该节点的值;如果只有右子树为空,则只需要在左子树外层加一对括号;如果左右子树都不为空,则需要分别在左右子树外层加一对括号。
func tree2str(root *TreeNode) string {
if root == nil {//节点为空,返回
return ""
}
if root.Left == nil && root.Right == nil {//左右节点都为空
return strconv.Itoa(root.Val)
}
if root.Right == nil {//右节点为空
return strconv.Itoa(root.Val) + "(" + tree2str(root.Left) + ")"
}
//左节点不为空的情况下
return strconv.Itoa(root.Val) + "(" + tree2str(root.Left) + ")(" + tree2str(root.Right) + ")"
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 8 ms , 在所有 Go 提交中击败了 87.95% 的用户 内存消耗: 7.4 MB , 在所有 Go 提交中击败了 78.31% 的用户 通过测试用例: 160 / 160 炫耀一下:
本文由 mdnice 多平台发布