剑指offer-序列化二叉树

问题

题目:[剑指offer-序列化二叉树]

思路

先说一下,下面的代码没有过,但是思路是对的。
我要求序列必须给出完全二叉树的形式,这样我才能计算正确的下表。但是题目序列化的时候,不是这么给的。我参考了一些网上做法,大家对序列化这个东西都是有自己的定义。

本质就是根据完全二叉树序列进行构建,然后广度优先遍历。

代码

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    char* Serialize(TreeNode *root) {    
        if(!root) return NULL;
        string ret;

        ret += (char)('0'+root->val);
        queue<TreeNode*> que;
        que.push(root);

        while(!que.empty()){
            root = que.front();
            que.pop();

            if( root->left ){
                ret += (char)('0'+root->left->val);
                que.push(root->left);
            }
            else
                ret += '#';

            if(root->right){
                ret += (char)('0'+root->right->val);
                que.push(root->right);
            }
            else
                ret += '#';
        }
        int sz = ret.size();
        int idx = sz - 1;
        while(ret[idx]=='#') --idx;
        string tmp = ret.substr(0, idx+1);
        return const_cast<char*>(tmp.c_str());

    }
    TreeNode* Deserialize(char *str) {
        if(!str) return NULL;
        return create_bitree( str, 0, strlen(str)-1 );
    }
private:
    TreeNode* create_bitree(char* str, int cur, int n){
        if( cur > n ) return NULL;
        if( str[cur] == '#' ) return NULL;

        TreeNode* root = new TreeNode( str[cur] - '0' );
        root->left = create_bitree( str, cur*2+1, n );
        root->right = create_bitree( str, cur*2 + 2, n );

        return root;
    }
};

思路2

今天二刷了这个题目,还是没有过。昨天末尾的时候,我想到了,可能是大家对于序列化的序列有不同的定义,所以导致不同的做法。今天我采用先序遍历的方法产生序列化。其中当左子树为空,但是右子树不为空的情形,需要添加#

代码

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    char* Serialize(TreeNode *root) {    
        string ans;
        pre_order( root, ans );

        return const_cast<char*>( ans.c_str() );
        //return ans;
    }
    TreeNode* Deserialize(char *str) {
        if( !str ) return NULL;
        int cur = 0;
        int n = strlen(str);

        return create_bitree( str, cur, n );
    }
private:
    TreeNode* create_bitree(char* arr, int& cur, int n){
        if( cur >= n || arr[cur] == '#' ) return NULL;
        else{
            TreeNode* root = new TreeNode( arr[cur] ); ++cur;
            root->left = create_bitree( arr, cur, n );
            root->right = create_bitree( arr, cur, n  );
            return root;
        }
    }
    int pre_order(TreeNode* root, string& ans){
        if(!root) return -1;
        else{
            ans += static_cast<char>(root->val);

            int ret = pre_order( root->left, ans );
            if(-1==ret && root->right){
                ret+='#';
            }

            pre_order( root->right, ans );


            return 0;
        }
    }
};

这是一个过了的链接[《剑指offer》序列化二叉树]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值