数据结构实验4-树与二叉树先序/中序/后续遍历

实验要求

任务1:以算法6.4创建二叉树的存储结构,树的具体形态自定。

任务2:对任务1中的二叉树分别实现先序、中序、后序遍历(递归实现)和中序遍历的非递归实现以及层序遍历;

任务3:统计1中树的结点总数、叶子结点总数以及树的高度;

程序代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX_TREE_SIZE 100
#define STACK_INIT_SIZE 200
#define STACKINCREMENT 10
#define MAXSIZE 100
#define namx 200
typedef int Status;
typedef int TElemType;
typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef BiTree ElemType;
typedef struct{
    ElemType *base;
    ElemType *top;
    int stacksize;
}Sqstack;
typedef struct Qnode{
    ElemType data;
    struct Qnode * next;
}QNode,*pQueue;
typedef struct{
    pQueue front;
    pQueue rear;
}LinkQueue;
Status InitQueue(LinkQueue & Q)
{
    Q.rear = (pQueue)malloc(sizeof(QNode));
    Q.front =  Q.rear;
    if(!Q.front) exit(OVERFLOW);
    Q.front->next = NULL;
    return OK;
}
Status IsEmptyQ(LinkQueue &Q)
{
    if(Q.front->next == NULL) return TRUE;
    else return FALSE;
}
Status Enqueue(LinkQueue & Q, ElemType e)
{
    QNode * p =(pQueue) malloc(sizeof(QNode));
    if(!p) exit(OVERFLOW);
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
    return OK;
}
Status Dequeue(LinkQueue & Q, ElemType & e)
{
    if(Q.front == Q.rear) return ERROR;
    pQueue p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if(Q.rear == p) Q.rear = Q.front;
    free(p);
    return OK;
}
Status InitStack(Sqstack & S)
{
    S.base = (ElemType *) malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if(!S.base) exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}
Status GetTop(Sqstack S,ElemType & e)
{
    if(S.top == S.base) return ERROR;
    e = *(S.top -1);
    return OK;
}
Status Push(Sqstack & S, ElemType e)
{
    if(S.top - S.base >= S.stacksize){
        S.base = (ElemType *) realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(ElemType));
        if(!S.base) exit(OVERFLOW);
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top ++ = e;
    return OK;
}
Status Pop (Sqstack & S, ElemType & e)
{
    if(S.top == S.base) return ERROR;
    e =  * -- S.top;
    return OK;
}
Status IsEmptyS(Sqstack S)
{
    if(S.top == S.base) return TRUE;
    else return FALSE;
}
Status CreatBiTree(BiTree & T)
{
    TElemType ch;
    scanf("%d",&ch);
    if(ch == -1) T = NULL;
    else{
        if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
        T->data = ch;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
    return OK;
}
Status PreOrderTraverse(BiTree &T)
{
    if(T){
        printf("%d ",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
    return OK;
}
Status InOrderTraverse(BiTree &T)
{
    if(T){
        InOrderTraverse(T->lchild);
        printf("%d ",T->data);
        InOrderTraverse(T->rchild);
    }
    return OK;
}
Status PostOrderTraverse(BiTree &T)
{
    if(T){
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%d ",T->data);
    }
    return OK;
}
Status InOrderTraverse_No(BiTree& T)
{
    Sqstack S;
    InitStack(S); BiTree p = T;
    while(p || !IsEmptyS(S)){
        if(p){
            Push(S,p);
            p = p->lchild;
        }else{
            Pop(S,p);
            printf("%d ",p->data);
            p = p->rchild;
        }
    }
    return OK;
}
Status LevelOrderTraverse(BiTree T)
{
    LinkQueue Q;
    InitQueue(Q);
    Enqueue(Q,T);
    if(!T) return ERROR;
    else printf("%d ",T->data);
    while(!IsEmptyQ(Q)){
        BiTree Temp ; Dequeue(Q,Temp);
        if(Temp->lchild){
            printf("%d ",Temp->lchild->data);
            Enqueue(Q,Temp->lchild);
        }
        if(Temp->rchild){
            printf("%d ",Temp->rchild->data);
            Enqueue(Q,Temp->rchild);
        }
    }
    return OK;
}
Status CalNodes(BiTree T)
{
    if(!T) return 0;
    LinkQueue Q;
    InitQueue(Q);
    int cnt = 1;
    Enqueue(Q,T);
    while(!IsEmptyQ(Q)){
        BiTree Temp ; Dequeue(Q,Temp);
        if(Temp->lchild){
            cnt++;
            Enqueue(Q,Temp->lchild);
        }
        if(Temp->rchild){
            cnt++;
            Enqueue(Q,Temp->rchild);
        }
    }
    return cnt;
}
Status CalLeavesNodes(BiTree T)
{
    if(!T) return 0;
    LinkQueue Q;
    InitQueue(Q);
    int cnt = 0;
    Enqueue(Q,T);
    while(!IsEmptyQ(Q)){
        BiTree Temp ; Dequeue(Q,Temp);
        if(Temp->lchild) Enqueue(Q,Temp->lchild);
        if(Temp->rchild) Enqueue(Q,Temp->rchild);
        if(!Temp->lchild && !Temp->rchild) cnt++;
    }
    return cnt;
}
Status CalHaight(BiTree T)
{
    if(!T) return 0;
    return max(CalHaight(T->lchild), CalHaight(T->rchild))+1;
}
void Paint()
{
    printf("|"); printf("     The Experiment Of Tree          ") ;printf("|\n");
    printf("|"); printf("              BiTree                 ") ;printf("|\n");
    printf("|"); printf("        Author: Luo Peng Fei         ") ;printf("|\n");
    printf("|"); printf("          Date:2017/4/26             ") ;printf("|\n");
}
int main()
{
    freopen("in.txt","r",stdin);
    Paint();
    BiTree T = (BiTree)malloc(sizeof(BiTNode));
    printf("|"); printf("            请输入建树信息           ") ;printf("|\n");
    CreatBiTree(T);
    printf("|"); printf("           树的先序遍历结果为        ") ;printf("|\n");
    PreOrderTraverse(T);
    printf("\n");
    printf("|"); printf("           树的中序遍历结果为        ") ;printf("|\n");
    InOrderTraverse(T);
    printf("\n");
    printf("|"); printf("           树的后序遍历结果为        ") ;printf("|\n");
    PostOrderTraverse(T);
    printf("\n");
    printf("|"); printf("           树的层序遍历结果为        ") ;printf("|\n");
    LevelOrderTraverse(T);
    printf("\n");
    printf("|"); printf("       树的中序非递归遍历结果为      ") ;printf("|\n");
    InOrderTraverse_No(T);
    printf("\n");
    printf("|"); printf("             树的节点总数为          ") ;printf("|\n");
    printf("%d\n",CalNodes(T));
    printf("|"); printf("          树的叶子节点总数为         ") ;printf("|\n");
    printf("%d\n",CalLeavesNodes(T));
    printf("|"); printf("              树的高度为             ") ;printf("|\n");
    printf("%d\n",CalHaight(T));

    return 0;
}

运行结果

这里写图片描述

树的结构
这里写图片描述

输入数据

1 2 4 -1 -1 5 -1 -1 3 6 -1 -1 7 -1 -1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值