题目描述
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
样例
输入: 二叉树: [1,2,3,4]
1
/ \
2 3
/
4
输出: "1(2(4))(3)"
解释: 原本将是“1(2(4)())(3())”,
在你省略所有不必要的空括号对之后,
它将是“1(2(4))(3)”。
输入: 二叉树: [1,2,3,null,4]
1
/ \
2 3
\
4
输出: "1(2()(4))(3)"
解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
算法
(递归) $O(n)$
- 采用递归的方式遍历整棵树,递归开始时,将 val 值写入字符串,然后考虑左右儿子的情况。
- 若左右儿子均不存在,则无需添加两对括号;若左右儿子都存在,则在递归左右儿子前均需要添加括号;若只有左儿子存在,则无需添加第二对括号;若只有右儿子存在,则需要添加第一对空括号保持一一映射的关系。
时间复杂度
- 每个结点仅遍历一次,故时间复杂度为 $O(n)$。
C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void dfs(TreeNode *r, string &s) {
if (r == NULL)
return;
s += to_string(r -> val);
if (r -> left == NULL && r -> right == NULL)
return;
s += "(";
dfs(r -> left, s);
s += ")";
if (r -> right) {
s += "(";
dfs(r -> right, s);
s += ")";
}
}
string tree2str(TreeNode* t) {
string ans = "";
dfs(t, ans);
return ans;
}
};
非递归怎么写呢
相当于二叉树先序遍历的非递归吧