树学习----二叉树的序列化和反序列化

这道题做了挺久,序列化很简单,而反序列化的那一堆string操作倒是查了比较久的资料。但这都不是重点。

重点是一直超时,而且我看了好多都觉得我的逻辑之类的都没啥问题,看了下过了49/52个例子。所以得去优化我的算法。

开始看了下热评第二的代码,一样都是前序遍历做的,但是他用的是queue,我用的是vector,改了之后依然是超时。

其次他用到了一个之前我没咋用过的stringstream。作用是分离之间的string子串,我照着改了一下,依然是超时。

关键点来了,最后我看到了个大佬的评论,他用的是java,但是他在评论中谈起,他用“+=”这个操作运算符时,耗时为721ms,而改用append()时,耗时降到了21ms。

所以在这一关键提示下,我把我的+=全部改成了append。终于过了,虽然耗时极大。又学到了一个新知识

class Codec {

public:

 

    // Encodes a tree to a single string.

    string serialize(TreeNode* root) {

        string res = "";

        Tr(res,root);

        return res;

    }

 

    void Tr(string& m,TreeNode* root){

        if(root == NULL){

            m.append("null,");

            return;

        }

        m.append(to_string(root->val));

        m.append(",");

        Tr(m,root->left);

        Tr(m,root->right);

    }

 

    // Decodes your encoded data to tree.

    TreeNode* deserialize(string data) {

        queue<string> nodes;

        int pos;

        while((pos = data.find(',')) != -1){

            string temp = data.substr(0,pos);

            data.erase(0,pos + 1);

            nodes.push(temp);

        }

        

        return dr(nodes);

    }

 

    TreeNode* dr(queue<string>& nodes){

        if(nodes.empty())   return NULL;

        string first = nodes.front();

        nodes.pop();

        if(first == "null")   return NULL;

        int m = atoi(first.c_str());

        TreeNode* root = new TreeNode(m);

        root->left = dr(nodes);

        root->right = dr(nodes);

        return root;

    }

};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值