为什么会有这样的区分?
比如上面的树我改成这样:
那么我输出的情况是 :1(2()(4))(3)
;如果不加以区分,我直接写成 1(2(4))(3)
,就会导致和之前那颗树,无法区别。所以在左树为空的情况下,右树还存在的情况下,还得加上 ()。
我们先别考虑那么多,走一个前序遍历,我都加上括号:
class Solution {
public:
string _tree2str(TreeNode* root,string& ret)
{
if(root == nullptr)
return ret;
ret += to_string(root->val);
ret += '(';
_tree2str(root->left,ret);
ret += ')';
ret += '(';
_tree2str(root->right,ret);
ret += ')';
return ret;
}
string tree2str(TreeNode* root)
{
string ret;
_tree2str(root,ret);
return ret;
}
};
看一下结果:
我简易讲一下:
前序遍历:根,左子树,右子树。
顺序:
1 -> 1(2) -> 1(2(4)) -> 1(2(4())) -> 1(2(4()())) ->1(2(4()())()) -> 1(2(4()())())(3) -> 1(2(4()())())(3()) ->1(2(4()())())(3()())
大家好好想想,现在我们的问题就是,完成去括号,也就是上面讲的左树为空,右树为空的两种情况:
class Solution {
public:
string _tree2str(TreeNode* root,string& ret)
{
if(root == nullptr)
return ret;
ret += to_string(root->val);
if(root->left || root->right)
{
ret += '(';
_tree2str(root->left,ret);
ret += ')';
}
if(root->right)
{
ret += '(';
_tree2str(root->right,ret);
ret += ')';
}
return ret;
}
string tree2str(TreeNode* root)
{
string ret;
_tree2str(root,ret);
return ret;
}
};
这样就过了: