开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
根据二叉树创建字符串
题目的意思就是前序遍历这个二叉树,遍历的结果是字符串的形式,该到题目的主要问题就是小括号的问题
()的问题。
- 我们写这个题目还是要用到递归的思想:
- 处理当前逻辑:如果节点不为空,把该值转成字符插入到字符串中;如果为空,就返回空字符串
- 处理子树:对于子树我们要考虑括号的问题,处理好括号问题之后,子树我们也可以看出一个树,所以直接把子树遍历的结果加到字符串就可以了。
- 什么时候加小括号呢?
左子树什么加括号?——左子树不为空的时候,一定要加;左子树为空的时候,右子树不为空的时候,一定要加括号
右子树什么时候加括号呢?——右子树不为空就加
- 返回遍历完成的字符串
class Solution {
public:
string tree2str(TreeNode* root) {
string str;
//当前逻辑
if(root)
str+=to_string(root->val);
else
return string();
//左树
if(root->left||root->right)
{
str+='(';
str+=tree2str(root->left);
str+=')';
}
//右树
if(root->right)
{
str+='(';
str+=tree2str(root->right);
str+=')';
}
return str;
}
};
虽然我们这样写可以,但是要注意到,每次返回的时候都有
string的拷贝,而对于string的拷贝,这个代价是非常大的,所以我们可以优化一下。比如我们写一个子函数,在传递参数的时候用字符串的引用,这样就可以减少拷贝了。
class Solution {
//因为传的是引用,所以不需要再返回字符串了,因为数字直接就添加到字符串str中去了。
void f(string& str,TreeNode* root)
{
//当前逻辑
if(root)
str+=to_string(root->val);
else
return ;
//左树
if(root->left||root->right)
{
str+='(';
f(str,root->left);
str+=')';
}
//右树
if(root->right)
{
str+='(';
f(str,root->right);
str+=')';
}
}
public:
string tree2str(TreeNode* root) {
string ret;
f(ret,root);
return ret;
}
};
我们发现这样改变之后,性能提升不少。