BM39 序列化二叉树

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
//
class Solution {
public:
    static int depTree(TreeNode *root,int dep)
    {
        if(root==NULL)
        {
            return dep;
        }
        else
        {
            int l=depTree(root->left,dep+1);
            int r=depTree(root->right,dep+1);
            return max(l,r);

        }
    }
    char* Serialize(TreeNode *root){    
        int dep=depTree(root,0);
        // printf("%d ",dep);
        string ss;
        static char a[105];
        queue<TreeNode*>qu;
        qu.push(root);
        int num=0;
        TreeNode *k=(TreeNode*)malloc(sizeof(TreeNode));
        k->val=35;
        k->left=NULL;
        k->right=NULL; 
        
        if(root==NULL)
        {
            strcpy(a,ss.c_str());
            return a;
        } 
        else if(root->right==NULL && root->left==NULL)
        {
            ss[0]=root->val;
            ss[1]='\0';
            strcpy(a,ss.c_str());
            return a;
            
        }
        else{
            for(int i=0;i<dep;i++)
            {
                queue<TreeNode*>qu1;
                if(i==dep-1)
                {
                     while(!qu.empty())
                    {
                        TreeNode *m=qu.front();
                        qu.pop();
                        if(m->val==35) 
                        {
                             ss[num++]=35;

                        }
                        else
                        {
                            ss[num++]=m->val;
                        }

                     }

                }
                else{
                        while(!qu.empty())
                        {
                            TreeNode *m=qu.front();
                            qu.pop();
                            
                            if(m->val==35) 
                            {
                                  ss[num++]=35;
                                  continue;
                            }
                            else
                            {
                             ss[num++]=m->val;
                             if(m->left==NULL)
                             {
                                 qu1.push(k);
                             }
                             else{
                                 qu1.push(m->left);
                             }
                             if(m->right==NULL)
                             {
                                 qu1.push(k);
                             }
                             else{
                                 qu1.push(m->right);
                             }
                           

                            }

                        }
                        qu=qu1;

                   }
               

            }
            ss[num]='\0';
            strcpy(a,ss.c_str());
            return a;
            
            
        }
    }
    TreeNode* Deserialize(char *str) {
        int n=0;
        while(str[n]!='\0')
        {
            n++;
        }
        char a=str[0];
        if(a=='\0') return NULL;
        int sum=0;
        TreeNode* root=(TreeNode*)malloc(sizeof(TreeNode));
        
        TreeNode* p=root;
        int j=2;
        root->val=(a+256)%256;
        root->left=NULL;
        root->right=NULL;
        if(n==1) return root;
        int num=1;
        queue<TreeNode*>qu;
        qu.push(root);
        while(true)
        {
            queue<TreeNode*>qu1;
            while(!qu.empty())
            {
                TreeNode *p=qu.front();
                qu.pop();
                 if(str[num]==35)
                 {
                     num++;
                     p->left=NULL;
                 }
                 else{
                      TreeNode* left1=(TreeNode*)malloc(sizeof(TreeNode));
                      left1->val=(str[num++]+256)%256;
                      left1->left=NULL;
                      left1->right=NULL;
                      p->left=left1;
                      qu1.push(left1);
                 }
                  if(str[num]==35)
                 {
                     num++;
                     p->right=NULL;
                 }
                 else{
                      TreeNode* right1=(TreeNode*)malloc(sizeof(TreeNode));
                      right1->val=(str[num++]+256)%256;
                      right1->left=NULL;
                      right1->right=NULL;
                      p->right=right1;
                      qu1.push(right1);
                 }
                 if(num==n) return root;
            }
            qu=qu1;
            if(qu1.empty()) return root;
        }



        // return NULL;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值