57.序列化二叉树(第二次做依然觉得有难度)

本文介绍了一个C++实现的二叉树序列化和反序列化的具体方法。通过将二叉树结构转化为字符串形式,实现了二叉树的有效存储,并能够从字符串还原二叉树结构。
序列化二叉树

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树
// 55.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <string>
using namespace::std;

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 == NULL) return "#";

		string r = to_string(root->val);
		r.push_back(',');

		char * left = Serialize(root->left);
		char* right = Serialize(root->right);

		char* p = new char[strlen(left) + strlen(right) + r.size()];
		strcpy(p, r.c_str());
		strcat(p, left);
		strcat(p, right);

		return p;
	}
	TreeNode* Deserialize(char *str) {
		return decode(str);
	}
private:
	TreeNode* decode(char *&str) {
		if (*str == '#') {
			++str;
			return NULL;
		}

		int num = 0;
		while (*str != ',')
			num = num * 10 + (*(str++) - '0');
		TreeNode* p = new TreeNode(num);
		++str;
		p->left = decode(str);
		p->right = decode(str);
		return p;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	//TreeNode p1(1);
	//TreeNode p2(2);
	//TreeNode p3(3);
	//TreeNode p4(4);
	//TreeNode p5(5);
	//TreeNode p6(6);

	//p1.left = &p2;
	//p1.right = &p3;

	//p2.left = &p4;

	//p3.left = &p5;
	//p3.right = &p6;

	TreeNode p1(100);
	TreeNode p2(50);
	TreeNode p3(150);

	p1.left = &p2;
	p1.right = &p3;

	Solution s;
	char* test = s.Serialize(&p1);
	TreeNode* result = s.Deserialize(test);
	return 0;
}

Serialize函数中
if (root == NULL) return "#";
双引号换成单引号
if (root == NULL) return '#';
会报错:error C2440: “return”: 无法从“char”转换为“char *”

第二次做:
/*
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 == NULL ) return "#" ;
        
        string r = to_string( root->val ) ;
        r.push_back( ',' ) ;
        
        char* left = Serialize( root->left ) ;
        char* right = Serialize( root->right ) ;
        
        char* p = new char[strlen(left) + strlen(right) + 1] ;
        strcpy( p, r.c_str() ) ;
        strcat( p, left ) ;
        strcat( p, right ) ;
        
        return p ;
    }
    TreeNode* Deserialize(char *str) {
    	return decode( str ) ;
    }
    
private:
    TreeNode* decode( char*& str ) {
        if ( *str == '#' ) {
            str++ ;
            return NULL ;
        }
        
        int num = 0 ;
        while ( *str != ',' ) 
            num = num * 10 + ( *( str++ ) - '0' ) ;
        TreeNode* p = new TreeNode( num ) ;
        ++ str ;
        p->left = decode( str ) ;
        p->right = decode( str ) ;
        
        return p ;
    }
};

第三次做:
/*
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 == NULL ) return "#" ;
        
        string r = to_string( root->val ) ;
        r.push_back( ',' ) ;
        
        char* left = Serialize( root->left ) ;
        char* right = Serialize( root->right ) ;
        
        char* retChar = new char[ strlen(left) + strlen(right) + 1 ] ;
        strcpy( retChar, r.c_str() ) ;
        strcat( retChar, left ) ;
        strcat( retChar, right ) ;
        
        return retChar ;
    }
    TreeNode* Deserialize(char *str) {
    	return decode( str ) ;
    }
    
    TreeNode* decode( char*& str ) {
        if ( *str == '#' ) {
            str++ ;
            return NULL ;
        }
        
        int num = 0 ;
        while ( *str != ',' ) 
            num = num * 10 + ( *(str++) - '0' ) ;
        ++ str ;
        TreeNode* p = new TreeNode( num ) ;
        p->left = decode( str ) ;
        p->right = decode( str ) ;
        
        return p ;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值