本体的难点:
解题过程:通过观察看到,每次遍历结点之前,打印了一个左括号;遍历到叶子,叶子的左右也要打印出括号来(先不考虑省略)。然后每个结点遍历完,也要打印右括号,这样才能保证包起来。
先把这个过程写出来:
class Solution {
public:
string tree2str(TreeNode* root) {
if(root==nullptr) //根为空,什么也不打印,因为进入这个结点之前,已经打印左括号了,再出来就会打印右括号。
{
return "";
}
string str = to_string(root->val);
str += "(";
str += tree2str(root->left);
str+=")";
str+="(";
str+=tree2str(root->right);
str+=")";
return str;
}
};
什么时候省略呢?
//左右都为空 省略
//左为空,右不为空 不省略
//右为空,左不为空 省略
class Solution {
public:
string tree2str(TreeNode* root) {
if(root==nullptr)
{
return "";
}
string str = to_string(root->val);
//左不为空,必须进去!因为得打印左孩子。
//左为空,右不为空,左括号不能省略,也得进去。
if(root->left || root->right)
{
str += "(";
str += tree2str(root->left);
str+=")";
}
//右为空就省略了。
if(root->right)
{
str+="(";
str+=tree2str(root->right);
str+=")";
}
return str;
}
};
这个代码虽然不难,但是这个代码的结构很难想出来,希望读者能够好好思考这道题,左右括号,写在哪里,才能满足题目要求!