题目
606.根据二叉树创建字符串
题目大意
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
样例
示例 1:
输入: 二叉树: [1,2,3,4]
1
/ \
2 3
/
4
输出: "1(2(4))(3)"
解释: 原本将是“1(2(4)())(3())”,
在你省略所有不必要的空括号对之后,
它将是“1(2(4))(3)”。
示例 2:
输入: 二叉树: [1,2,3,null,4]
1
/ \
2 3
\
4
输出: "1(2()(4))(3)"
解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
数据规模
无
思路
这里用的是递归的方法:使用递归的方法得到二叉树的前序遍历,并在递归时加上额外的括号。
主要有 5 5 5种情况:
-
如果当前节点为空,直接返回空字符串
""
-
如果当前节点没有孩子,那不需要在节点后面加上任何括号
-
如果当前节点有两个孩子,那么在递归时,需要在两个孩子的结果外都加上一层括号;
-
如果当前节点只有左孩子,那么在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号
-
如果当前节点只有右孩子,那么在递归时,需要先加上一层空的括号
()
表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。
代码
// short int long float double bool char string void
// array vector stack queue auto const operator
// class public private static friend extern
// sizeof new delete return cout cin memset malloc
// relloc size length memset malloc relloc size length
// for while if else switch case continue break system
// endl reverse sort swap substr begin end iterator
// namespace include define NULL nullptr exit equals
// index col row arr err left right ans res vec que sta
// state flag ch str max min default charray std
// maxn minn INT_MAX INT_MIN push_back insert
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
typedef pair<int, string>PIS;
const int maxn=1e6+50;//注意修改大小
long long read(){long long x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;}
ll qpow(ll x,ll q,ll Mod){ll ans=1;while(q){if(q&1)ans=ans*x%Mod;q>>=1;x=(x*x)%Mod;}return ans%Mod;}
/**
* 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->left==nullptr&&root->right==nullptr){
return to_string(root->val);
}
if(root->left==nullptr){
return to_string(root->val)+"("+")"+"("+tree2str(root->right)+")";
}
if(root->right==nullptr){
return to_string(root->val)+"("+tree2str(root->left)+")";
}
return to_string(root->val)+"("+tree2str(root->left)+")"+"("+tree2str(root->right)+")";
}
};