4-21 二叉树的基本操作 (10分)

来源:互联网 发布:神虎数据恢复软件 编辑:程序博客网 时间:2024/05/16 11:47

T是一个二叉树,函数CreateBiTree(BiTree &T)是创建一颗二叉树(使用数据结构书上的方式),函数PreOrder(BiTree &T)是输出树的先序遍历,函数InOrder(BiTree &T)是输出树的中序遍历,函数PostOrder(BiTree &T)是输出树的后序遍历,函数LevelOrder(BiTree &T)是输出树的层序遍历。数据保证合法。

函数接口定义:

void CreateBiTree(BiTree &T);void PreOrder(BiTree &T);void InOrder(BiTree &T);void PostOrder(BiTree &T);void LevelOrder(BiTree &T);

其中 T 是二叉树。

裁判测试程序样例:

#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef char TElemType;typedef struct BiTNode {    TElemType data;    struct BiTNode *lchild;    struct BiTNode *rchild;}BiTNode, *BiTree;/////////////////////////////////typedef BiTNode * QElemType;typedef struct QNode {    QElemType data;    struct QNode * next;}QNode, *QueuePtr;typedef struct {    QueuePtr front;    QueuePtr rear;}LinkQueue;Status InitQueue_L(LinkQueue &Q) {    Q.front = (QueuePtr) malloc (sizeof(QNode));    if (Q.front == NULL)        return OVERFLOW;    Q.front->next = NULL;    Q.rear = Q.front;    return OK;}bool QueueEmpty_L(LinkQueue &Q) {    return (Q.front == Q.rear);}int QueueLength_L(LinkQueue &Q) {    int count = 0;    for (QNode *p = Q.front->next; p != NULL; p = p->next)        count++;    return count;}Status EnQueue_L(LinkQueue &Q, QElemType e) {    QNode *s = (QNode *) malloc (sizeof(QNode));    s->data = e;    s->next = NULL;    Q.rear->next = s;    Q.rear = s;    return OK;}Status DeQueue_L(LinkQueue &Q) {    QNode *q = Q.front->next;    Q.front->next = q->next;    if (q->next == NULL)        Q.rear =  Q.front;    free(q);    return OK;}void PrintQueue_L(LinkQueue &Q) {    for (QNode *p = Q.front->next; p != NULL; p = p->next)        printf("%c", p->data->data);    printf("\n");}/////////////////////////////////void CreateBiTree(BiTree &T);void PreOrder(BiTree &T);void InOrder(BiTree &T);void PostOrder(BiTree &T);void LevelOrder(BiTree &T);int main() {    BiTree T;    CreateBiTree(T);    printf("PreOrder:");    PreOrder(T);    printf("\n");    printf("InOrder:");    InOrder(T);    printf("\n");    printf("PostOrder:");    PostOrder(T);    printf("\n");    printf("LevelOrder:");    LevelOrder(T);    printf("\n");    return 0;}/* 你的代码将被嵌在这里 */

输入格式:

按照数据结构树上的建图方式,给出建树的字符串

输出格式:

依次输出树的先序遍历,中序遍历,后序遍历和层序遍历

输入样例:

ab#c##d##

输出样例:

PreOrder:abcdInOrder:bcadPostOrder:cbdaLevelOrder:abdc

题目判定

#include <stack>#include <queue>using namespace std;void CreateBiTree(BiTree &T)  {      char data;      data = getchar();      if(data == '#')      {          T = NULL;      }      else      {          T=(BiTNode *)malloc(sizeof(struct BiTNode));        T->data = data;          CreateBiTree(T->lchild);          CreateBiTree(T->rchild);     }  }  void PreOrder(BiTree &T) {      if(T)      {          printf("%c",T->data);        PreOrder(T->lchild);//遍历左子树           PreOrder(T->rchild);//遍历右子树       }  }  void InOrder(BiTree &T){      if(T)      {          InOrder(T->lchild);//遍历左子树           printf("%c",T->data);//输出根节点值           InOrder(T->rchild);//遍历右子树       }  }  void PostOrder(BiTree &T)  {      if(T)      {          PostOrder(T->lchild);//遍历左子树           PostOrder(T->rchild);//遍历右子树           printf("%c",T->data);//输出根节点值       }   }void LevelOrder(BiTree &T){    if (!T)    {        return;    }    queue<BiTree> TreeQueue;    TreeQueue.push(T);    BiTree p = T;    while (!TreeQueue.empty())    {        p = TreeQueue.front();        TreeQueue.pop();        printf("%c", p->data);        if (p->lchild)        {            TreeQueue.push(p->lchild);        }        if (p->rchild)        {            TreeQueue.push(p->rchild);        }    }}

完整代码

#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef char TElemType;typedef struct BiTNode {    TElemType data;    struct BiTNode *lchild;    struct BiTNode *rchild;}BiTNode, *BiTree;/////////////////////////////////typedef BiTNode * QElemType;typedef struct QNode {    QElemType data;    struct QNode * next;}QNode, *QueuePtr;typedef struct {    QueuePtr front;    QueuePtr rear;}LinkQueue;Status InitQueue_L(LinkQueue &Q) {    Q.front = (QueuePtr) malloc (sizeof(QNode));    if (Q.front == NULL)        return OVERFLOW;    Q.front->next = NULL;    Q.rear = Q.front;    return OK;}bool QueueEmpty_L(LinkQueue &Q) {    return (Q.front == Q.rear);}int QueueLength_L(LinkQueue &Q) {    int count = 0;    for (QNode *p = Q.front->next; p != NULL; p = p->next)        count++;    return count;}Status EnQueue_L(LinkQueue &Q, QElemType e) {    QNode *s = (QNode *) malloc (sizeof(QNode));    s->data = e;    s->next = NULL;    Q.rear->next = s;    Q.rear = s;    return OK;}Status DeQueue_L(LinkQueue &Q) {    QNode *q = Q.front->next;    Q.front->next = q->next;    if (q->next == NULL)        Q.rear =  Q.front;    free(q);    return OK;}void PrintQueue_L(LinkQueue &Q) {    for (QNode *p = Q.front->next; p != NULL; p = p->next)        printf("%c", p->data->data);    printf("\n");}/////////////////////////////////void CreateBiTree(BiTree &T);void PreOrder(BiTree &T);void InOrder(BiTree &T);void PostOrder(BiTree &T);void LevelOrder(BiTree &T);int main() {    BiTree T;    CreateBiTree(T);    printf("PreOrder:");    PreOrder(T);    printf("\n");    printf("InOrder:");    InOrder(T);    printf("\n");    printf("PostOrder:");    PostOrder(T);    printf("\n");    printf("LevelOrder:");    LevelOrder(T);    printf("\n");    return 0;}#include <stack>#include <queue>using namespace std;void CreateBiTree(BiTree &T)  {      char data;      data = getchar();      if(data == '#')      {          T = NULL;      }      else      {          T=(BiTNode *)malloc(sizeof(struct BiTNode));        T->data = data;          CreateBiTree(T->lchild);          CreateBiTree(T->rchild);     }  }  void PreOrder(BiTree &T) {      if(T)      {          printf("%c",T->data);        PreOrder(T->lchild);//遍历左子树           PreOrder(T->rchild);//遍历右子树       }  }  void InOrder(BiTree &T){      if(T)      {          InOrder(T->lchild);//遍历左子树           printf("%c",T->data);//输出根节点值           InOrder(T->rchild);//遍历右子树       }  }  void PostOrder(BiTree &T)  {      if(T)      {          PostOrder(T->lchild);//遍历左子树           PostOrder(T->rchild);//遍历右子树           printf("%c",T->data);//输出根节点值       }   }void LevelOrder(BiTree &T){    if (!T)    {        return;    }    queue<BiTree> TreeQueue;    TreeQueue.push(T);    BiTree p = T;    while (!TreeQueue.empty())    {        p = TreeQueue.front();        TreeQueue.pop();        printf("%c", p->data);        if (p->lchild)        {            TreeQueue.push(p->lchild);        }        if (p->rchild)        {            TreeQueue.push(p->rchild);        }    }}

结果PTA系统里面没得分!

0 0
原创粉丝点击