二叉树的存储:会者不难

goodsong 2002-05-20 06:51:59
定义结点如下
class CNode
{
int data;
CNode* lchild;
CNode* rchild;
}
请问怎样将整棵树保存在文件中,并能从文件中恢复成保存前的结构?
以前一直在内存里操作,现在要保存,不知从何下手,请指教!
谢谢!
...全文
153 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodsong 2002-05-20
  • 打赏
  • 举报
回复
12:00了,结贴
good wishes to all
goodsong 2002-05-20
  • 打赏
  • 举报
回复
谢谢大家的关注
liuty2006 2002-05-20
  • 打赏
  • 举报
回复
mark
Microsoftadherent 2002-05-20
  • 打赏
  • 举报
回复
遍历,用链表,多容易控制呀,我的图的数据结构都是这么实现的。何必在不容易控制的递归上下工夫呢?
Cline 2002-05-20
  • 打赏
  • 举报
回复
与 ydaye(ydaye) 思路基本相近。
1。首先必需明确,保存的文件中必须有保存一种父子关系。所以需要能够标识每一个结点和其父结点。(当然可以用XML)
2。那种标识,可以在保存时生成。
3。从文件中读取数据时,再把这种父子关系换成二叉树。所以需要还要定义一种结构或者类,来(临时,在生成树之前保存父子关系)保存从文件中取出的数据。

如果是这样,你在读取文件时,还得判断是否出现了森林或者回路。(这个东西实际上不难写,用Java写就更方便了)

zf925 2002-05-20
  • 打赏
  • 举报
回复
给你一个我写的可以串兴化的类(参照《深入浅出mfc》写的)


class CCharFont : public CObject
{
public:
int Start;
int Stop;
CHARFORMAT font;

public:
CCharFont();
~CCharFont();
CCharFont(CCharFont &charFont);
CCharFont(int fStart, int fStop, CHARFORMAT* fFont);
CCharFont& operator=(CCharFont charFont);

public:
DECLARE_SERIAL(CCharFont)
public:
virtual void Serialize(CArchive& ar);
};







IMPLEMENT_SERIAL(CCharFont, CObject, 1)

CCharFont::CCharFont() :
Start(0),
Stop(0)
{
memset(&font, 0, sizeof(CHARFORMAT));
}

CCharFont::CCharFont(CCharFont &charFont)
{
Start = charFont.Start;
Stop = charFont.Stop;
memcpy(&(font), &(charFont.font), sizeof(CHARFORMAT));
}

CCharFont::CCharFont(int fStart, int fStop, CHARFORMAT* pFont)
{
Start = fStart;
Stop = fStop;
memcpy(&font, pFont, sizeof(CHARFORMAT));
}

CCharFont& CCharFont::operator=(CCharFont charFont)
{
Start = charFont.Start;
Stop = charFont.Stop;
memcpy(&(font), &(charFont.font), sizeof(CHARFORMAT));
return *this;
}

CCharFont::~CCharFont()
{
}

void CCharFont::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar<<Start;
ar<<Stop;
unsigned char* p = new (unsigned char[sizeof(CHARFORMAT)]);
memcpy(p, &font, sizeof(CHARFORMAT));
for(int i=0; i<sizeof(CHARFORMAT); i++)
{
ar<<*(p + i);
}
delete p;
}
else
{
ar>>Start;
ar>>Stop;
unsigned char* p = new (unsigned char[sizeof(CHARFORMAT)]);
for(int i=0; i<sizeof(CHARFORMAT); i++)
{
ar>>*(p + i);
}
memcpy(&font, p, sizeof(CHARFORMAT));
delete p;
}
}




rchu 2002-05-20
  • 打赏
  • 举报
回复
最经典的数据结构方法是:
先把前序遍历的各个节点依次保存
再把中序遍历的各个节点依次保存
恢复的时候,用一个简单的递归算法就可以生成原样的二叉树。
qhq800 2002-05-20
  • 打赏
  • 举报
回复
帮你up
goodsong 2002-05-20
  • 打赏
  • 举报
回复
发现还有个贴子加分的功能,
加了50分大家继续啊
请大家帮忙看看
http://www.csdn.net/expert/topic/738/738085.xml?temp=.5143396
分我向来是不会少给的,而且一般一天之内结贴,绝不超过三天,即使没有得到正确解答,参与者也是有分的,hehe
goodsong 2002-05-20
  • 打赏
  • 举报
回复
谢谢各位!
我试试!
先不结贴,我觉得这个问题是个常见问题,让大家再讨论讨论,看有没有其它方法。12:00以前一定结。
scl 2002-05-20
  • 打赏
  • 举报
回复
你可以加多个TEST
用递归!
void save(*node)
{
if(node!=null)
{
fwrite(filename,*root,sizeof(node));
if(lchile!=null)
save(*lchile);
if(rchile!=null)
save(*rchild);
}
}
读取时相同!

ydaye 2002-05-20
  • 打赏
  • 举报
回复
方法可多了,不一定非要用链表存树啊,可以用数组阿,这样存取都很方便。
struct CNode // c++
{
int data;
int parent; // 根据需要可以加上父节点,这个随意了
int left; // 左子树根节点下标,空为-1
int right; // 右子树根节点下标
void init(){parent=left=right=-1;}
};
CNode tree[100];
这样使用和存取都很方便,为了灵活控制空间就用动态数组。
goodsong 2002-05-20
  • 打赏
  • 举报
回复
谢谢各位!
我真的不太懂
请各位务必给个正确完整的方法,要不我就死定了。
不需要程序,只要你这样做过,或能肯定这样做是可行的就行了。
豆豆的我能理解
wxbfly(背着黄金的飞鸟)的明白意思,但不知具体如何做
星星的看起来最简洁,但这样做真的行吗?因为我的树不是满二叉树
scl 2002-05-20
  • 打赏
  • 举报
回复
我只提供了个思路,
程序写的****
scl 2002-05-20
  • 打赏
  • 举报
回复
用递归!
void save(*node)
{
fwrite(filename,*root,sizeof(node));
save(*lchile);
save(*rchild);
}
读取时相同!
void read(*node)
{
*root=fread(filename,*root,sizeof(node));
*lchild=read(filename,*lchild,sizeof(node));
*rchild=read(filename,*rchild,sizeof(node));
}
wxbfly 2002-05-20
  • 打赏
  • 举报
回复
这样试试,将整个二叉树分层顺序(从左到右,从上到下)写入文件中,但在每个节点中多写一个信息,来指示它的子女节点在文件中的偏移位置,如果没有就用0来表示。在读入的时候就根据这些位置重建节点并重建节点之间的关系。

仅提供一种思想,供参考。
DouDouBug 2002-05-20
  • 打赏
  • 举报
回复
写错了,改正如下
在存文件之前,你因该知道这个二叉树有多少节点,就可以动态定一个树组,
按照子节点的位置为其父节点的位置*2及*2+1来算子节点的存储位置,把数据放入到树组中,然后再逐个写入文件,读出时,可先读到树组中在来构造二叉树。
DouDouBug 2002-05-20
  • 打赏
  • 举报
回复
在存文件之前,你因该知道这个二叉树有多少节点,就可以动态定一个节点,
按照子节点的位置为其父节点的位置*2及*2+1来算子节点的存储位置,把数据放入到树组中,然后再逐个写入文件,读出时,可先读到树组中在来构造二叉树。
KeepLoading 2002-05-20
  • 打赏
  • 举报
回复
看看侯的《深入浅出MFC》啊,你会有所启发的。好象是第三、四章吧!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧