根据二叉树创建字符串

原题:

你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。

空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:

  1. 输入: 二叉树: [1,2,3,4]
  2. 1
  3. / \
  4. 2 3
  5. /
  6. 4
  7. 输出: "1(2(4))(3)"
  8. 解释: 原本将是“1(2(4)())(3())”,
  9. 在你省略所有不必要的空括号对之后,
  10. 它将是“1(2(4))(3)”。

示例 2:

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

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

解释: 和第一个示例相似,
除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。

解题方法:

解法一:

class Solution {
public:
    string tree2str(TreeNode* t) {
        if(!t) return "";
        string res;
        CreateString(t,res);
        return res;
    }

    string CreateString(TreeNode* t,string& res)
    {
        if(!t) return NULL;
        res+=to_string(t->val);
        if(t->left)
        {
            res+="(";
            res+=CreateString(t->left,res);
            res+=")";
        }
        if(!t->left&&t->right)
        {
            res+="()";
        }
        if(t->right)
        {
            res+="(";
            res+=CreateString(t->right,res);
            res+=")";
        }
        return "";     //此处不能return NULL
    }

};

做题小结:

针对解法一:

  1. 做这道简单题的速度还是太慢了点,这道题的第一个坑是对于string只能返回空字符串,不能去返回NULL。
  2. 第二个坑是+=”(“必须分开写,如果跟递归写在一起,都会优先计算递归
  3. 要注意的地方就是对res使用&来改变它的值