请教数据结构的一道题

qqweinizhizhuo 2009-04-27 06:08:57
假设以二叉链表存储的二叉树中,每个节点数据元素均为单个字符
1.从控制台读入二叉树的先序序列和中序序列,以二叉链表为存储结构建立二叉树
2.以树的形式显示该二叉树
...全文
199 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
whhvc 2009-04-30
  • 打赏
  • 举报
回复
ding
Paradin 2009-04-30
  • 打赏
  • 举报
回复
nice
qqweinizhizhuo 2009-04-30
  • 打赏
  • 举报
回复
上面没有用代码形式发出来,下面发一个代码形式的

#define MAXSIZE 256
#include<iostream>
using namespace std;
#include<cstdlib>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
////////////////////////队列的相关操作////////////
typedef struct QNode
{
BiTNode data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
bool InitQueue(LinkQueue &Q) //初始化一个空队列
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
return false;
Q.front->next=NULL;
return true;
}

bool EnQueue(LinkQueue &Q,BiTNode e) //将元素e插入到队列中
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
return false;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return true;
}
bool DeQueue(LinkQueue &Q,BiTNode &e) //出队
{
if(Q.rear==Q.front)
return false;
QueuePtr p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return true;
}

////////////////二叉树的操作////////////////////
BiTree CreatTree(char A[],char B[],int n) //由先序和中序序列创建二叉树
{
BiTree T;
int i;
if(n<=0)
return 0;
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
return 0;
T->data=*A;
for(i=0;i <n;i++)
{
if( A[0]== B[i]) break;
}
T->lchild=CreatTree(A+1,B,i);
T->rchild=CreatTree(A+i+1,B+i+1,n-i-1);
return T;
}

void PrintTree(BiTree T,int i) //按6.69要求打印
{
if(T->rchild)
PrintTree(T->rchild,i+1);
for(int j=1;j<=i;j++)
cout<<" ";
cout<<T->data<<endl;;
if(T->lchild)
PrintTree(T->lchild,i+1);
}

void Postorder (BiTree T)
{
if (T!=NULL)
{
Postorder(T->lchild); //后序遍历根的左子树
Postorder(T->rchild); //后序遍历根的右子树
cout<<T->data;//访问根结点
}//if
}//postorder

void Levelorder(BiTree T) //层序遍历
{
LinkQueue Q; //定义队列
InitQueue(Q);
if(T==NULL)
exit(-1);
BiTree p=T;
BiTNode e;
EnQueue(Q,*p);
while(Q.front!=Q.rear)
{

DeQueue(Q,e);
cout<<e.data;
if(e.lchild)
EnQueue(Q,*e.lchild);
if(e.rchild)
EnQueue(Q,*e.rchild);
}
cout<<endl;
}
//////////////////////////main///////////////////////////
int main()
{
char str1[MAXSIZE],str2[MAXSIZE];
char c;
int i=0,j=0;
BiTree Tree;
cout<<"请输入先序序列:"<<endl;
c=getchar();
while(c!='\n')
{
str1[i]=c;
i++;
c=getchar();
}
cout<<"请输入中序序列:"<<endl;
c=getchar();
while(c!='\n')
{
str2[j]=c;
j++;
c=getchar();
}
if(i!=j)
{
cerr<<"error!输入错误"<<endl;
exit(-1);
}
Tree=CreatTree(str1,str2,j);
if(Tree)
cout<<"二叉树构建成功"<<endl;
else
cerr<<"二叉树构建失败"<<endl;
cout<<"\n以树的形式输入二叉树"<<endl;
PrintTree(Tree,0);
cout<<"\n后续序列为:"<<endl;
Postorder (Tree);
cout<<"\n层序序列为:"<<endl;
Levelorder(Tree);
cout<<endl;
return 0;
}
lingyin55 2009-04-29
  • 打赏
  • 举报
回复
不错,学习

[Quote=引用 9 楼 qqweinizhizhuo 的回复:]
谢谢大家的帮忙,我把自己写的代码和大家分享哈!
[code=C/C++]
[/#define MAXSIZE 256
#include <iostream>
using namespace std;
#include <cstdlib>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
////////////////////////队列的相关操作////////////
typedef struct QNode
{
BiTNode data;
struct QNode *next;
}QNode,*QueuePtr;
typedef str…
[/Quote]
liliangbao 2009-04-29
  • 打赏
  • 举报
回复
帮顶 ~
qqweinizhizhuo 2009-04-29
  • 打赏
  • 举报
回复
谢谢大家的帮忙,我把自己写的代码和大家分享哈!
[code=C/C++]
[/#define MAXSIZE 256
#include<iostream>
using namespace std;
#include<cstdlib>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
////////////////////////队列的相关操作////////////
typedef struct QNode
{
BiTNode data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
bool InitQueue(LinkQueue &Q) //初始化一个空队列
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
return false;
Q.front->next=NULL;
return true;
}

bool EnQueue(LinkQueue &Q,BiTNode e) //将元素e插入到队列中
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
return false;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return true;
}
bool DeQueue(LinkQueue &Q,BiTNode &e) //出队
{
if(Q.rear==Q.front)
return false;
QueuePtr p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return true;
}

////////////////二叉树的操作////////////////////
BiTree CreatTree(char A[],char B[],int n) //由先序和中序序列创建二叉树
{
BiTree T;
int i;
if(n<=0)
return 0;
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
return 0;
T->data=*A;
for(i=0;i <n;i++)
{
if( A[0]== B[i]) break;
}
T->lchild=CreatTree(A+1,B,i);
T->rchild=CreatTree(A+i+1,B+i+1,n-i-1);
return T;
}

void PrintTree(BiTree T,int i) //按6.69要求打印
{
if(T->rchild)
PrintTree(T->rchild,i+1);
for(int j=1;j<=i;j++)
cout<<" ";
cout<<T->data<<endl;;
if(T->lchild)
PrintTree(T->lchild,i+1);
}

void Postorder (BiTree T)
{
if (T!=NULL)
{
Postorder(T->lchild); //后序遍历根的左子树
Postorder(T->rchild); //后序遍历根的右子树
cout<<T->data;//访问根结点
}//if
}//postorder

void Levelorder(BiTree T) //层序遍历
{
LinkQueue Q; //定义队列
InitQueue(Q);
if(T==NULL)
exit(-1);
BiTree p=T;
BiTNode e;
EnQueue(Q,*p);
while(Q.front!=Q.rear)
{

DeQueue(Q,e);
cout<<e.data;
if(e.lchild)
EnQueue(Q,*e.lchild);
if(e.rchild)
EnQueue(Q,*e.rchild);
}
cout<<endl;
}
//////////////////////////main///////////////////////////
int main()
{
char str1[MAXSIZE],str2[MAXSIZE];
char c;
int i=0,j=0;
BiTree Tree;
cout<<"请输入先序序列:"<<endl;
c=getchar();
while(c!='\n')
{
str1[i]=c;
i++;
c=getchar();
}
cout<<"请输入中序序列:"<<endl;
c=getchar();
while(c!='\n')
{
str2[j]=c;
j++;
c=getchar();
}
if(i!=j)
{
cerr<<"error!输入错误"<<endl;
exit(-1);
}
Tree=CreatTree(str1,str2,j);
if(Tree)
cout<<"二叉树构建成功"<<endl;
else
cerr<<"二叉树构建失败"<<endl;
cout<<"\n以树的形式输入二叉树"<<endl;
PrintTree(Tree,0);
cout<<"\n后续序列为:"<<endl;
Postorder (Tree);
cout<<"\n层序序列为:"<<endl;
Levelorder(Tree);
cout<<endl;
return 0;
}
]
  • 打赏
  • 举报
回复
http://bbs.bccn.net/thread-256410-1-1.html

通过前序和中序,建立二叉树
  • 打赏
  • 举报
回复
http://www.cnblogs.com/air8712/archive/2006/12/31/608981.html
利用绘图函数实现了二叉树在屏幕上的输出//感觉绘图更方便一些
qqweinizhizhuo 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cyldf 的回复:]
1.从控制台读入二叉树的先序序列和中序序列,以二叉链表为存储结构建立二叉树
这个代码在数据结构书上有的
2.以树的形式显示该二叉树
这个是要画图么
[/Quote]
不是要画图,只是按照树的形状输出这棵树
rivulettornado 2009-04-27
  • 打赏
  • 举报
回复
第一部分比较简单了,只要进行读取,进行新的叶节点的插入就对了。第二个就显得有点复杂了,但是基本的思路还是采用中序输出,设置好输出点的位置,以及表现树的东西就对了
cyldf 2009-04-27
  • 打赏
  • 举报
回复
1.从控制台读入二叉树的先序序列和中序序列,以二叉链表为存储结构建立二叉树
这个代码在数据结构书上有的
2.以树的形式显示该二叉树
这个是要画图么?
lingyin55 2009-04-27
  • 打赏
  • 举报
回复
OenAuth.Net 2009-04-27
  • 打赏
  • 举报
回复
baidu or google "c++ 二叉树遍历"

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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