主题:树的普通习题,请教!
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAX(a,b) (a>b?a:b)
typedef char TElemType;
typedef int Status;
//二叉树的二叉链表存储结构
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct QNode
{
BiTree data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue *Q)
{
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front)exit(OVERFLOW);
(*Q).front->next=NULL;
return OK;
}
Status EnQueue(LinkQueue *Q,BiTree e)
{
QNode *p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data=e;
p->next=NULL;
(*Q).rear->next=p;
(*Q).rear=p;
return OK;
}
BiTree DeQueue(LinkQueue *Q)
{BiTree e;
QNode *p;
if(Q->front==Q->rear)
return ERROR;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return e;
}
Status Empty(LinkQueue *Q)
{
if(Q->rear==Q->front)
return OK;
else
return ERROR;
}
//先序遍历生成二叉树
Status CreatBiTree(BiTree &T){
TElemType ch,temp;
printf("输入一个元素: ");
scanf("%c",&ch);
temp=getchar(); //结束回车
if(ch==' ') T=NULL; //输入空格表示结点为空树
else{
if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch; //生成根结点
CreatBiTree(T->lchild); //构造左子树
CreatBiTree(T->rchild); //构造右子树
}
return OK;
}
//打印元素
Status PrintElem(TElemType e){
printf("%c ",e);
return OK;
}
Status Visit(TElemType e){
printf("%c ",e);
return OK;
}
//先序遍历二叉树
Status PreOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){ //二叉树不为空时
if(Visit(T->data)) //访问根结点
if(PreOrderTraverse(T->lchild,Visit)) //先序遍历左子树
if(PreOrderTraverse(T->rchild,Visit)) return OK; //先序遍历右子树
return ERROR;
}
else return OK;
}
//中序遍历二叉树
Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit)) return OK;
else return ERROR;
}
return OK;
}
//后序遍历二叉树
Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if(Visit(T->data)) return OK;
else return ERROR;
}
return OK;
}
void level(BiTree T)
{
LinkQueue *Q;
InitQueue(Q);
while(T||!Empty(Q));
{
Visit(T->data);
if(T->lchild)
EnQueue(Q,T->lchild);
if(T->rchild)
EnQueue(Q,T->rchild);
T=DeQueue(Q);
}
}
//求二叉树的深度
int BiTreeDepth(BiTree T){
if(!T) return 0; //二叉树为空树时
int Dl=0,Dr=0;
if(T->lchild) Dl=BiTreeDepth(T->lchild); //求左子树深度
if(T->rchild) Dr=BiTreeDepth(T->rchild); //求右子树深度
return MAX(Dl,Dr)+1;
}
//主函数
void main()
{
BiTree T;
Status (* Visit)(TElemType);
Visit=PrintElem;
CreatBiTree(T);
printf("\n先序遍历:");
PreOrderTraverse(T,Visit);
printf("\n中序遍历:");
InOrderTraverse(T,Visit);
printf("\n后序遍历:");
PostOrderTraverse(T,Visit);
printf("\n层次序遍历:");
level(T);
printf("\n二叉树深度为%d",BiTreeDepth(T));
printf("\n程序结束.\n");
}
哪位高手帮我看看哪个地方还没编好,我实在想不出来了!
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAX(a,b) (a>b?a:b)
typedef char TElemType;
typedef int Status;
//二叉树的二叉链表存储结构
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct QNode
{
BiTree data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue *Q)
{
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front)exit(OVERFLOW);
(*Q).front->next=NULL;
return OK;
}
Status EnQueue(LinkQueue *Q,BiTree e)
{
QNode *p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data=e;
p->next=NULL;
(*Q).rear->next=p;
(*Q).rear=p;
return OK;
}
BiTree DeQueue(LinkQueue *Q)
{BiTree e;
QNode *p;
if(Q->front==Q->rear)
return ERROR;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return e;
}
Status Empty(LinkQueue *Q)
{
if(Q->rear==Q->front)
return OK;
else
return ERROR;
}
//先序遍历生成二叉树
Status CreatBiTree(BiTree &T){
TElemType ch,temp;
printf("输入一个元素: ");
scanf("%c",&ch);
temp=getchar(); //结束回车
if(ch==' ') T=NULL; //输入空格表示结点为空树
else{
if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch; //生成根结点
CreatBiTree(T->lchild); //构造左子树
CreatBiTree(T->rchild); //构造右子树
}
return OK;
}
//打印元素
Status PrintElem(TElemType e){
printf("%c ",e);
return OK;
}
Status Visit(TElemType e){
printf("%c ",e);
return OK;
}
//先序遍历二叉树
Status PreOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){ //二叉树不为空时
if(Visit(T->data)) //访问根结点
if(PreOrderTraverse(T->lchild,Visit)) //先序遍历左子树
if(PreOrderTraverse(T->rchild,Visit)) return OK; //先序遍历右子树
return ERROR;
}
else return OK;
}
//中序遍历二叉树
Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit)) return OK;
else return ERROR;
}
return OK;
}
//后序遍历二叉树
Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if(Visit(T->data)) return OK;
else return ERROR;
}
return OK;
}
void level(BiTree T)
{
LinkQueue *Q;
InitQueue(Q);
while(T||!Empty(Q));
{
Visit(T->data);
if(T->lchild)
EnQueue(Q,T->lchild);
if(T->rchild)
EnQueue(Q,T->rchild);
T=DeQueue(Q);
}
}
//求二叉树的深度
int BiTreeDepth(BiTree T){
if(!T) return 0; //二叉树为空树时
int Dl=0,Dr=0;
if(T->lchild) Dl=BiTreeDepth(T->lchild); //求左子树深度
if(T->rchild) Dr=BiTreeDepth(T->rchild); //求右子树深度
return MAX(Dl,Dr)+1;
}
//主函数
void main()
{
BiTree T;
Status (* Visit)(TElemType);
Visit=PrintElem;
CreatBiTree(T);
printf("\n先序遍历:");
PreOrderTraverse(T,Visit);
printf("\n中序遍历:");
InOrderTraverse(T,Visit);
printf("\n后序遍历:");
PostOrderTraverse(T,Visit);
printf("\n层次序遍历:");
level(T);
printf("\n二叉树深度为%d",BiTreeDepth(T));
printf("\n程序结束.\n");
}
哪位高手帮我看看哪个地方还没编好,我实在想不出来了!