https://leetcode-cn.com/problems/construct-string-from-binary-tree/
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
示例 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)"
解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。
/* 思路
根据示例,可知左右子树前后有括号,如果左子树为空且右子树不为空,则需拼接();
如果右子树为空,则不拼接,如果左右子树都为空,则不拼接左右子树的();
注意: 拼接使用strcat, 不能用snprintf,原因snprintf拼接自身时不安全,需建立缓冲区。
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void get_len(struct TreeNode* t, int *len){
if(!t){ return;}
char tmp[20] = {0};
snprintf(tmp, 20, "%d", t->val);
*len += strlen(tmp);
if(NULL != t->left){
*len += 2;
get_len(t->left, len);
}
if(NULL == t->left && NULL != t->right){ *len += 2;}
if(NULL != t->right){
*len += 2;
get_len(t->right, len);
}
}
void traversing(struct TreeNode* t, char *ret){
if(!t){
return;
}
char tmp[20] = {0};
snprintf(tmp, 20, "%d", t->val);
strcat(ret,tmp);
if(NULL != t->left){
strcat(ret, "(");
traversing(t->left, ret);
strcat(ret, ")");
}
if(NULL == t->left && NULL != t->right){
strcat(ret, "()");
}
if(NULL != t->right){
strcat(ret, "(");
traversing(t->right, ret);
strcat(ret, ")");
}
}
char * tree2str(struct TreeNode* t){
int len = 0;
get_len(t, &len); // 获取组成的字符串长度
char *ret = (char *)calloc(len + 1, sizeof(char));
traversing(t, ret); // 根据长度开空间,并拼接字符串
return ret;
}