你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 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)”;解释: 和第一个示例相似,除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
这里我们使用递归的思路先创建一个可以容纳二叉树数据的数组,或使用动态开辟申请,因为使用前序遍历,所以我们拿到根节点的时候就向返回空间里预先写入(,和根的val,当左子节点为空时写入(),因为题目要求根节点不带括号,所以我们将它单独处理后再调用带括号的递归函数;
参考代码:
char*array;
int treesize;
void _tree2str(struct TreeNode* t) {
if(t==NULL){
return ;
}
array[treesize++]='(';
int n= sprintf(array+treesize,"%d",t->val);//返回打印个数,打印到array+treesize处
treesize +=n;
if(t->left==NULL&&t->right!=NULL){
array[treesize++]='(';
array[treesize++]=')';
}else{
_tree2str(t->left);
}
_tree2str(t->right);
array[treesize++]=')';
}
char* tree2str(struct TreeNode* t) {
if(t==NULL){
return "";
}
array=(char*)malloc(sizeof(char)*100*10000);
treesize= 0;
int n= sprintf(array+treesize,"%d",t->val);
treesize +=n;
if(t->left==NULL&&t->right!=NULL){
array[treesize++]='(';
array[treesize++]=')';
}else{
_tree2str(t->left);
}
_tree2str(t->right);
array[treesize++]='\0';
return array;
}