序列化二叉树
- 参与人数:1044时间限制:1秒空间限制:32768K
- 算法知识视频讲解
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
// 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 ;
}
};
本文介绍了一个C++实现的二叉树序列化和反序列化的具体方法。通过将二叉树结构转化为字符串形式,实现了二叉树的有效存储,并能够从字符串还原二叉树结构。
986

被折叠的 条评论
为什么被折叠?



