1 思路解析
所有的二叉树问题都是遍历问题。
这是个前序遍历的问题。
2 问题易错点
值有可能是负数或者是大于10的数。
这个时候还是用ret(*retIndex)++的话,会多写很多代码。不过好处是通俗易懂。
2.1 以后涉及字符串输出的问题
首先考虑sprintf函数,可能更简单一些
#define LEN 100000
void num(struct TreeNode* t, char* ret, int* retIndex)
{
int num = t->val;
if (num == 0) {
ret[(*retIndex)++] = '0';
return;
}
if (t->val < 0) {
ret[(*retIndex)++] = '-';
num = abs(t->val);
}
int num1[100000] = {0};
int len = 0;
while (num > 0) {
int n1 = num % 10;
num = num / 10;
num1[len++] = n1;
}
int i = 0;
int j = len - 1;
while (i < j) {
int temp = num1[i];
num1[i] = num1[j];
num1[j] = temp;
i++;
j--;
}
for (i = 0; i < len; i++) {
ret[(*retIndex)++] = num1[i] + '0';
}
}
void pre(struct TreeNode* t, char* ret, int* retIndex)
{
if (t == NULL) {
return;
}
if (t->left == NULL && t->right != NULL) {
ret[(*retIndex)++] = '(';
num(t, ret, retIndex);
ret[(*retIndex)++] = '(';
ret[(*retIndex)++] = ')';
pre(t->right, ret, retIndex);
ret[(*retIndex)++] = ')';
} else {
ret[(*retIndex)++] = '(';
num(t, ret, retIndex);
pre(t->left, ret, retIndex);
pre(t->right, ret, retIndex);
ret[(*retIndex)++] = ')';
}
}
void pre1(struct TreeNode* t, char* ret, int* retIndex)
{
if (t == NULL) {
return;
}
if (t->left == NULL && t->right != NULL) {
num(t, ret, retIndex);
ret[(*retIndex)++] = '(';
ret[(*retIndex)++] = ')';
pre(t->right, ret, retIndex);
} else {
num(t, ret, retIndex);
pre(t->left, ret, retIndex);
pre(t->right, ret, retIndex);
}
}
char * tree2str(struct TreeNode* t){
char* ret = (char*)malloc(sizeof(char) * LEN);
int retIndex = 0;
memset(ret, 0, sizeof(char) * LEN);
pre1(t, ret, &retIndex);
return ret;
}