难度简单349
给你二叉树的根节点 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
思路:
首先,因为返回的类型是 string,如果我们在该函数进行递归的话,会一直返回 string 而不是 string&,导致不断的拷贝构造,这样子内存消耗和执行效率就会变低,所以我们将实现的函数独立出来,然后用传引用的方式减少拷贝!
步骤:
- 若节点为空则直接返回
- 若不为空了,则将其节点的值用库函数 to_string 转化为字符串然后尾插到 str
- 然后分别判断一下什么时候要加括号:
- 对于左子树:如果左子树不为空或者左子树为空且右子树不为空,都要加上括号
- 对于右子树:只有当右子树不为空时要加括号
- 接着不断调用其左右子树去递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void tree(TreeNode* root, string& str)
{
if(root == nullptr)
{
return;
}
str += to_string(root->val);
// 1、对于左子树:左子树不为空或者左子树为空,右子树不为空都要加括号
if(root->left || root->right)
{
str += '(';
tree(root->left, str);
str += ')';
}
// 2、对于右子树:右子树不为空才需要加
if(root->right)
{
str += '(';
tree(root->right, str);
str += ')';
}
}
string tree2str(TreeNode* root)
{
string str;
tree(root, str); //交给
return str;
}
};