主题:紧急求救!!!!二叉树线索化的C程序谁帮帮我啊
月牙上的精灵
[专家分:130] 发布于 2005-06-18 23:42:00
题目:构件一课二叉树,实现文件读入
中序遍历二叉树
中序线索化二叉树
中序遍历线索二叉树
怎么办好哦!!?
星期一就要交了,
我怎么也写不出来
各位大哥
急救!!!!
急救!!!!
回复列表 (共3个回复)
沙发
月牙上的精灵 [专家分:130] 发布于 2005-06-19 23:07:00
同志们,
偶做出来了哦
不懂的同学可以参考![em2]
#include <iostream.h>
#include <stdlib.h>
#include<fstream.h>
#include<stdio.h>
#define link 0
#define thread 1
#define OVERFLOW 0
#define ok 1
#define error 0
fstream infile;
typedef struct Bitreenode
{
int data;
struct Bitreenode *lchild,*rchild;
int ltag,rtag; //定义链式存储结构
}Bitreenode,*Bitree;
Bitree pre;
int count=0; //count为计数器,标记inthreading()的退出
void CreateBitree(Bitree &bt) //先序构造二叉树
{
int parent;
if(infile>>parent&&parent!=EOF) //读入文件且文件没有结束
{
if(parent==-2) bt=NULL; //-2表示没有孩子
else
{
if(!(bt=(Bitreenode *)malloc(sizeof(Bitreenode)))) exit(OVERFLOW);
bt->data=parent; //生成根结点
bt->ltag=0;
bt->rtag=0;
cout<<parent<<' '; //输出读入的数字
CreateBitree(bt->lchild); //构造左子树
CreateBitree(bt->rchild); //构造右子树
}//else
}
//return bt;
}
void zxbl(Bitree bt) //中序遍历二叉树的递归算法
{
if (bt) {
zxbl(bt->lchild); // 访问左子树
cout<<bt->data<<' '; // 访问当前结点
zxbl(bt->rchild); //访问右子树
}
}
void zxblxsh(Bitree pt) //中序遍历线索二叉树
{
Bitreenode *qt;
qt=pt->lchild; //指向根结点
while(qt!=pt)
{ //空树或遍历结束时,QT==PT
while(qt->ltag==link) qt=qt->lchild;
cout<<qt->data<<' '; //访问其左子树为空的结点
while(qt->rtag==thread&&qt->rchild!=pt)
{
qt=qt->rchild;
cout<<qt->data<<' ';
} //访问后继结点
qt=qt->rchild;
}
}
void Inthreading(Bitree qt,const Bitree pt)
{
if(qt)
{
if(pre==pt&&count!=0)
return;
Inthreading(qt->lchild,pt); //左子树线索化
if(!qt->lchild)
{
qt->ltag=thread;
qt->lchild=pre;
} //前驱线索
if(!pre->rchild)
{
pre->rtag=thread;
pre->rchild=qt;
} //后继线索
pre=qt; //保持PRE指向P的前驱
Inthreading(qt->rchild,pt);
count++;
} //右子树线索化
}
Bitree xsh(Bitree bt,Bitree &pt) //线索化二叉树
{ if(!(pt=(Bitree)malloc(sizeof(Bitreenode))))
exit(OVERFLOW);
pt->ltag=link; //建立头结点
pt->rtag=thread;
pt->rchild=pt; //右指针回指
if(!bt)
pt->lchild=pt;
else
{
pt->lchild=bt;
pre=pt;
Inthreading(pt,pt); //中序遍历进行中序线索化
pre->rchild=pt;
pre->rtag=thread; //最后一个结点线索化
pt->rchild=pre;
}
return pt;
}
void main()
{ Bitree bt,pt;
infile.open("data1.txt",ios::in);
if(!infile){
cout<<"data1.txt can't open."<<endl;
abort();}//if
cout<<"先序构造二叉树:"<<endl;
CreateBitree(bt);
cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
zxbl(bt);
cout<<endl;
cout<<"线索化后中序遍历二叉树:"<<endl;
xsh(bt,pt); //in threading
zxblxsh(pt); //中须遍历线索化
cout<<endl;
}//main
板凳
月牙上的精灵 [专家分:130] 发布于 2005-06-19 23:07:00
我还是觉得好难学啊
数据结构<-------想说爱你并不是意见很容易的事
[em2]
3 楼
雨523 [专家分:200] 发布于 2006-10-19 17:18:00
d
我来回复