早上好各位,今天起的很早就打开了LeetCode,让我们开始吧。

LeetCode 606. 根据二叉树创建字符串

题目

你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。

空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例

示例1:

1
2
3
4
5
6
7
8
9
10
11
12
输入: 二叉树: [1,2,3,4]
1
/ \
2 3
/
4

输出: "1(2(4))(3)"

解释: 原本将是“1(2(4)())(3())”,
在你省略所有不必要的空括号对之后,
它将是“1(2(4))(3)”。

示例2:

1
2
3
4
5
6
7
8
输入: 二叉树: [1,2,3,null,4]
1
/ \
2 3
\
4

输出: "1(2()(4))(3)"

题解

题目做多了后,一看就是递归。

我们把要输出的 string 提取出来写出公式:
root->val(root->left)(root->right)

一目了然。

再将递归方法套进去

root->val(tree2str(root->left))(tree2str(root->right))

当然还有其他条件了。

  • root->right == nullptr 时我们要省略掉 root->right 的括号,如下:
    root->val(tree2str(root->left))
  • root->right==nullptr && root->left==nullptr 时我们就只需要返回 root->val
  • root == nullptr 时我们只需要返回空字符串 “”

这样我们才算真正地完成了对题目的解读,可以开始写代码了。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//执行 12 ms 超越 90.28%  消耗 25.5 MB 超越 49.86%
/**
* 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:
string tree2str(TreeNode* root) {
if(root==nullptr)
return "";
if(root->right==nullptr && root->left==nullptr)
return to_string(root->val);
if(root->right!=nullptr)
return to_string(root->val)+"("+tree2str(root->left)+")"+"("+tree2str(root->right)+")";
else
return to_string(root->val)+"("+tree2str(root->left)+")";
return "";
}
};

简单!

PS

此解法非唯一解,且不一定是最好的解法,如果您有更好的解法,欢迎在评论区中提出。