根据二叉树创建字符串

101 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情


根据二叉树创建字符串

题目的意思就是前序遍历这个二叉树,遍历的结果是字符串的形式,该到题目的主要问题就是小括号的问题() 的问题。

  • 我们写这个题目还是要用到递归的思想:
  1. 处理当前逻辑:如果节点不为空,把该值转成字符插入到字符串中;如果为空,就返回空字符串
  2. 处理子树:对于子树我们要考虑括号的问题,处理好括号问题之后,子树我们也可以看出一个树,所以直接把子树遍历的结果加到字符串就可以了。
  • 什么时候加小括号呢?

左子树什么加括号?——左子树不为空的时候,一定要加;左子树为空的时候,右子树不为空的时候,一定要加括号

右子树什么时候加括号呢?——右子树不为空就加

  1. 返回遍历完成的字符串
class Solution {
public:
    string tree2str(TreeNode* root) {
        string str;
        //当前逻辑
        if(root)
        str+=to_string(root->val);
        else
        return string();
		//左树
        if(root->left||root->right)
        {
            str+='(';
            str+=tree2str(root->left);
            str+=')';
        }
        //右树
        if(root->right)
        {
            str+='(';
            str+=tree2str(root->right);
            str+=')';
        }
        return str;
    }
};

虽然我们这样写可以,但是要注意到,每次返回的时候都有string 的拷贝,而对于string 的拷贝,这个代价是非常大的,所以我们可以优化一下。比如我们写一个子函数,在传递参数的时候用字符串的引用,这样就可以减少拷贝了。

class Solution {
    //因为传的是引用,所以不需要再返回字符串了,因为数字直接就添加到字符串str中去了。
    void f(string& str,TreeNode* root)
    {
    //当前逻辑
        if(root)
        str+=to_string(root->val);
        else
        return ;
 	//左树
        if(root->left||root->right)
        {
            str+='(';
            f(str,root->left);
            str+=')';
        }
        //右树
        if(root->right)
        {
            str+='(';
            f(str,root->right);
            str+=')';
        }
        
    }
public:
    string tree2str(TreeNode* root) {
        string ret;

        f(ret,root);
        return ret;
    }
};

我们发现这样改变之后,性能提升不少。