主题:求助~~~~高手进来看下~~~~
sq160
[专家分:0] 发布于 2006-02-25 14:16:00
题目是《建立二叉数,层序、先序遍历》 要用《数据结构》跟《C语言》的知识做~~~
有会的吗?小弟不太懂啊~~~
向各位大侠求助~~~~~~~谢谢~~
小弟的邮箱sq160@126.com
回复列表 (共4个回复)
沙发
cryer [专家分:1250] 发布于 2006-02-25 14:21:00
网上有数据结构(清华版)的算法实现,因为书上原来都是伪代码,有人做了完整的代码在网上,你可以找找..你的问题都是书上的例题
板凳
sq160 [专家分:0] 发布于 2006-02-25 14:25:00
我找找看~
谢谢~
3 楼
Tokyson [专家分:90] 发布于 2006-04-03 18:17:00
层次,先序会,建树不会
树怎么建阿,是给出中序遍历,先(后)序遍历,建立一棵树,还是怎么建
要求说得清楚一点啊
4 楼
冷月星光 [专家分:16520] 发布于 2006-04-06 16:53:00
#include <stdlib.h>
#include <stdio.h>
#define queuesize 100
#define null 0
typedef char datatype;
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;//定义二叉链表结点结构
typedef bintnode *bintree;//定义二叉链表指针类型
typedef struct{
int front,rear;
bintree data[queuesize];//循环队列元素类型为二叉链表结点指针
int count;
}cirqueue;//循环队列结构定义
void createbintree(bintree *);
void preorder(bintree );
void inorder(bintree );
void postorder(bintree );
void leverorder(bintree );
void main()//主函数
{//建立二叉树的二叉链表表示,并进行先序遍历、中序遍历、后序遍历和按层次遍历,
bintree t=null;
printf("please input nodes of bintree:\n");
createbintree(&t);//建立二叉链表
printf("the preorder is:");
preorder(t);//对二叉树t进行先序遍历
printf("\n");
printf("the inorder is:");
inorder(t);//对二叉树t进行中序遍历
printf("\n");
printf("the postorder is:");
postorder(t);//对二叉树t进行后序遍历
printf("\n");
printf("the leverorder is:");
leverorder(t);//对二叉树t进行按层次遍历
printf("\n");
}
void createbintree(bintree *t)
{//输入二叉树的先序遍历序列,创建二叉链表
char ch;
if ((ch=getchar())==' ')//如果读入空格字符,创建空树
*t=null;
else
{
*t=(bintnode*)malloc(sizeof(bintnode));//申请根结点*t空间
(*t)->data=ch;//将结点数据ch放入根结点的数据域
createbintree(&(*t)->lchild);//建左子树
createbintree(&(*t)->rchild);//建右子树
}
}
void preorder(bintree t)
{//对二叉树进行先序遍历
if(t)
{
printf("%c",t->data);
preorder(t->lchild);
preorder(t->rchild);
}
}
void inorder(bintree t)
{//对二叉树进行中序遍历
if(t)
{
inorder(t->lchild);
printf("%c",t->data);
inorder(t->rchild);
}
}
void postorder(bintree t)
{//对二叉树进行后序遍历
if(t)
{
postorder(t->lchild);
postorder(t->rchild);
printf("%c",t->data);
}
}
error(char *message)
{//出错时,调用的返回出错信息,终止程序运行的函数
fprintf(stderr,"error:%s\n",message);
exit(1);
}
void leverorder(bintree t)
{
cirqueue *q;
bintree p=t;
q=(cirqueue*)malloc(sizeof(cirqueue));//申请循环队列空间
q->rear=q->front=q->count=0;//将循环队列初始化为空
q->data[q->rear]=t;q->count++;q->rear=(q->rear+1)%queuesize;//将根结点入队
while(q->count)//若队列不为空,做以下操作
if (q->data[q->front])//当队首元素不为空指针,做以下操作
{
p=q->data[q->front];//取队首元素*p
printf("%c",q->data[q->front]->data);//打印*p结点的数据域信息
q->front=(q->front+1)%queuesize;q->count--;//队首元素出队
if (q->count==queuesize)//若队列为队满,则打印队满信息,退出程序的执行
error("the queue is full!");
else
{//若队列不满,将*p结点的左孩子指针入队
q->count++;q->data[q->rear]=p->lchild;
q->rear=(q->rear+1)%queuesize;
}
if (q->count==queuesize)
error("the queue full!");
else{//若队列不满,将*p结点的右孩子指针入队
q->count++;q->data[q->rear]=p->rchild;
q->rear=(q->rear+1)%queuesize;
}
}
else{//当队首元素为空指针,将空指针出队
q->front=(q->front+1)%queuesize;q->count--;
}
}
int nodes(bintree t)
{
if (!t)//若二叉树为空树
return 0;//返回结点数0
else//若二叉树非空
return nodes(t->lchild)+nodes(t->rchild)+1;
//二叉树的结点总数为左、右子树的结点总数加上1(根结点)
}
我来回复