Redian新闻
>
一个树,不一定是2叉树,让设计一个数据结构来serialize和 deserialize
avatar
一个树,不一定是2叉树,让设计一个数据结构来serialize和 deserialize# JobHunting - 待字闺中
e*s
1
再CAIWU的面经上看到的,有没有大牛给个IDEA?
avatar
j*y
2
感觉还是可以用 pre-order travers 一个 left child, right siblin 的结构吧.

【在 e***s 的大作中提到】
: 再CAIWU的面经上看到的,有没有大牛给个IDEA?
avatar
w*x
3
/*
Serialize/DeSerialize a tree
*/
struct NODE
{
int nVal;
vector vec;
NODE(int n) : nVal(n) {}
};
void _inner_serial(NODE* pNode, char*& p)
{
if (NULL == pNode)
return;
*p++ = pNode->vec.size();
*p++ = pNode->nVal;
for (vector::iterator it = pNode->vec.begin();
it != pNode->vec.end(); it++)
_inner_serial(*it, p);
}
const char* Serialize(NODE* pRoot, char mem[])
{
if (NULL == mem || NULL == pRoot)
return NULL;
char* p = mem;
_inner_serial(pRoot, p);
return mem;
}
NODE* _inner_deserial(const char*& p)
{
int n = *p++;
NODE* pRet = new NODE(*p++);
for (int i = 0; i < n; i++)
pRet->vec.push_back(_inner_deserial(p));
return pRet;
}
NODE* DeSerialize(const char mem[])
{
if (NULL == mem)
return NULL;
const char* p = mem;
return _inner_deserial(p);
}
avatar
j*y
4
thanks.

【在 w****x 的大作中提到】
: /*
: Serialize/DeSerialize a tree
: */
: struct NODE
: {
: int nVal;
: vector vec;
: NODE(int n) : nVal(n) {}
: };
: void _inner_serial(NODE* pNode, char*& p)

avatar
j*y
5
这种情况下 child是没有顺序的,是吧?
如何把 serialized的 array写到一个file去,然后从file读回来 重建树呢?
多谢 :)

【在 w****x 的大作中提到】
: /*
: Serialize/DeSerialize a tree
: */
: struct NODE
: {
: int nVal;
: vector vec;
: NODE(int n) : nVal(n) {}
: };
: void _inner_serial(NODE* pNode, char*& p)

avatar
c*w
6

我一直对你的头像很感兴趣,这个女的是谁?

【在 w****x 的大作中提到】
: /*
: Serialize/DeSerialize a tree
: */
: struct NODE
: {
: int nVal;
: vector vec;
: NODE(int n) : nVal(n) {}
: };
: void _inner_serial(NODE* pNode, char*& p)

avatar
e*s
7
非常感谢!!

【在 w****x 的大作中提到】
: /*
: Serialize/DeSerialize a tree
: */
: struct NODE
: {
: int nVal;
: vector vec;
: NODE(int n) : nVal(n) {}
: };
: void _inner_serial(NODE* pNode, char*& p)

avatar
e*s
8
再CAIWU的面经上看到的,有没有大牛给个IDEA?
avatar
j*y
9
感觉还是可以用 pre-order travers 一个 left child, right siblin 的结构吧.

【在 e***s 的大作中提到】
: 再CAIWU的面经上看到的,有没有大牛给个IDEA?
avatar
w*x
10
/*
Serialize/DeSerialize a tree
*/
struct NODE
{
int nVal;
vector vec;
NODE(int n) : nVal(n) {}
};
void _inner_serial(NODE* pNode, char*& p)
{
if (NULL == pNode)
return;
*p++ = pNode->vec.size();
*p++ = pNode->nVal;
for (vector::iterator it = pNode->vec.begin();
it != pNode->vec.end(); it++)
_inner_serial(*it, p);
}
const char* Serialize(NODE* pRoot, char mem[])
{
if (NULL == mem || NULL == pRoot)
return NULL;
char* p = mem;
_inner_serial(pRoot, p);
return mem;
}
NODE* _inner_deserial(const char*& p)
{
int n = *p++;
NODE* pRet = new NODE(*p++);
for (int i = 0; i < n; i++)
pRet->vec.push_back(_inner_deserial(p));
return pRet;
}
NODE* DeSerialize(const char mem[])
{
if (NULL == mem)
return NULL;
const char* p = mem;
return _inner_deserial(p);
}
avatar
j*y
11
thanks.

【在 w****x 的大作中提到】
: /*
: Serialize/DeSerialize a tree
: */
: struct NODE
: {
: int nVal;
: vector vec;
: NODE(int n) : nVal(n) {}
: };
: void _inner_serial(NODE* pNode, char*& p)

avatar
j*y
12
这种情况下 child是没有顺序的,是吧?
如何把 serialized的 array写到一个file去,然后从file读回来 重建树呢?
多谢 :)

【在 w****x 的大作中提到】
: /*
: Serialize/DeSerialize a tree
: */
: struct NODE
: {
: int nVal;
: vector vec;
: NODE(int n) : nVal(n) {}
: };
: void _inner_serial(NODE* pNode, char*& p)

avatar
c*w
13

我一直对你的头像很感兴趣,这个女的是谁?

【在 w****x 的大作中提到】
: /*
: Serialize/DeSerialize a tree
: */
: struct NODE
: {
: int nVal;
: vector vec;
: NODE(int n) : nVal(n) {}
: };
: void _inner_serial(NODE* pNode, char*& p)

avatar
e*s
14
非常感谢!!

【在 w****x 的大作中提到】
: /*
: Serialize/DeSerialize a tree
: */
: struct NODE
: {
: int nVal;
: vector vec;
: NODE(int n) : nVal(n) {}
: };
: void _inner_serial(NODE* pNode, char*& p)

avatar
u*o
15
是赵雅芝啊,好像是她在京华烟云里姚木兰的扮相。。

【在 c***w 的大作中提到】
:
: 我一直对你的头像很感兴趣,这个女的是谁?

avatar
S*t
16
you can encode the structure of the generic tree with 2n bits, and
reconstruct the structure from the 2n bits

【在 e***s 的大作中提到】
: 再CAIWU的面经上看到的,有没有大牛给个IDEA?
avatar
m*k
17
抛一砖:
How about in-order traversal?
String serialize(Node root){
if(root == null){
return "()";
}
else{
return "(" + serialize( root.left) + root.val + serialize( root.
right) + ")" ;
}
}
ex:
1
/ \
2 3
/ \
4 5
will return
( ( (()4()) 2 ( ()5()) ) 1 ( ()3 () ) )
deserialize:
easy with stack,
avatar
z*e
18
做一个bfs就好了
((root))
(()(1)(2))
(()(3)()(4))
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。