题目链接
本体的难点:
- 什么时候去打印左右括号?
- 什么时候省略?
解题过程:通过观察看到,每次遍历结点之前,打印了一个左括号;遍历到叶子,叶子的左右也要打印出括号来(先不考虑省略)。然后每个结点遍历完,也要打印右括号,这样才能保证包起来。
先把这个过程写出来:
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;}
};
这个代码虽然不难,但是这个代码的结构很难想出来,希望读者能够好好思考这道题,左右括号,写在哪里,才能满足题目要求!