开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
一、题目描述:
606. 根据二叉树创建字符串 - 力扣(LeetCode)
给你二叉树的根节点 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
二、思路分析:
不考虑空括号的正确性,将整颗树完整的生成为字符串:
- 根节点生成一个值
- 左括号 + 递归生成左子树 + 右括号
- 左括号 + 递归生成右子树 + 右括号
然后创建一个空串,遍历生成的串,挨个赋值,跳过不需要的那些括号。
时间复杂度O(n),空间复杂度O(n)
三、AC 代码:
class Solution {
public:
string tree2str(TreeNode* t) {
string s = dfs(t);
string news;
for(int i = 0; i < s.size(); ){
if(i + 3 < s.size() && s[i] == '(' && s[i + 1] == ')' && s[i + 2] == '(' && s[i +3] == ')'){
i += 4;
continue;
}
if(i + 1 < s.size() && s[i] == '(' && s[i + 1] == ')'){
if(i + 2 == s.size()){
break;
}else if(s[i + 2] == ')'){
i += 2;
continue;
}
}
news += s[i++];
}
return news;
}
private:
string dfs(TreeNode* t){
if(!t){
string s = "";
return s;
}
string s;
s += to_string(t->val);
s += "(";
s += dfs(t->left);
s += ")";
s += "(";
s += dfs(t->right);
s +=")";
return s;
}
};