LeetCode606. The binary tree create a string (binary tree traversal order, string concatenation)

https://leetcode-cn.com/problems/construct-string-from-binary-tree/
you need preorder traversal manner, a binary tree is converted into a string of integers and brackets.

The empty node with an empty pair of parentheses "()", respectively. And you do not need to omit all affect one mapping between the original binary string of empty parentheses right.
Example 1:

输入: 二叉树: [1,2,3,4]
       1
     /   \
    2     3
   /    
  4     

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

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

Example 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;
}

Guess you like

Origin blog.csdn.net/qq_34595352/article/details/92983579