c++数据结构--二叉树的应用

实验内容:

实现教材中算法5.4描述的二叉树创建算法,在此基础上实现二叉树的先序、后序递归遍历算法、两种非递归中序遍历、层序遍历、求二叉树的深度。

实验步骤:

(1)按照实验要求编写代码,构造二叉树。
(2)输入验收用例,验证其输出结果。

#include <iostream>
#ifndef DATA_STRUCTURE_STATUS_H
#include <stdio.h>
//状态码
#define TRUE              1
#define FALSE            0
#define OK                  1
#define ERROR           0
#endif
#ifndef OVERFLOW
#define OVERFLOW    -2
#endif // OVERFLOW
#ifndef NULL
#define NULL((void*) 0)
#endif // NULL
typedef int Status;
#define MAXSIZE 100
using namespace std;

typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;//数据域
    struct BiTNode *lchild,*rchild;//左孩子,右孩子
}BiTNode,*BiTree;

typedef BiTNode* ElemType;


typedef struct QNode
{
    ElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct LQueue
{
    QueuePtr front;
    QueuePtr rear;
}LQueue;

Status InitQueue(LQueue &Q)
{
    Q.front=Q.rear=new QNode;
    Q.front->next=NULL;
    return OK;
}

Status Enqueue(LQueue &Q,ElemType e)
{
    QueuePtr q;
    q=new QNode;
    q->data=e;
    q->next=NULL;
    Q.rear->next=q;
    Q.rear=q;
    return OK;
}

Status Dequeue(LQueue &Q)
{
    if(Q.front==Q.rear)
    {
        return ERROR;
    }
    QNode* p;
    ElemType e;
    p=Q.front->next;
    e=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)
    {
        Q.rear=Q.front;
    }
    delete p;
    return OK;
}

bool EmptyQueue(LQueue Q)
{
    if(Q.front==Q.rear)
        return true;
    return false;
}

ElemType GetHead(LQueue Q)
{
    if(Q.front==Q.rear)return ERROR;
    ElemType e;
    e=Q.front->next->data;
    return e;
}

void CreateBiTree(BiTree &T)
{//1.先序遍历创建二叉树
    char ch;
    cin>>ch;
    if(ch=='#')
    {
        T=NULL;
    }
    else{
        T=new BiTNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }

}

void PreOrderTraverse(BiTree T)
{//2.递归先序遍历算法
    if(T)
    {
        cout<<T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}

void PostOrderTraverse(BiTree T)
{//3.递归后序遍历算法
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout<<T->data;
    }
}

void InOrderTraverse(BiTree T)
{//4.中序遍历算法
    if(T)
    {
        InOrderTraverse(T->lchild);
        cout<<T->data;
        InOrderTraverse(T->rchild);
    }
}

void InOrderTree(BiTree T)
{//5.中序非遍历算法

    BiTree stack[100],p=T;//建立一个顺序栈,设置一个临时指针,并将指针p指向根节点;
    BiTree q;
    int top=0;//设置顺序栈的初始大小为0;

    while(top>0||p!=NULL)//循环条件,栈大小不为空或者p非空;
    {
        if(p!=NULL)//如果遇到非空二叉树,入栈,并沿着当前节点的左链遍历当前节点的左子树;
        {
            stack[++top]=p;
            p=p->lchild;
        }
        else{
        //如果遇到空的二叉树,就将指针出栈,并打印出出栈指针的值,并沿着当前节点的右链遍历当前节点的右子树;
            q=stack[top--];
            cout<<q->data;
            p=q->rchild;
        }
    }
}


void LevelOrderTree(BiTNode* T)
{
    LQueue Q;
    BiTNode* p;
    InitQueue(Q);
    Enqueue(Q,T);
    while(!EmptyQueue(Q))
    {
        p=GetHead(Q);
        putchar(p->data);
        if(p->lchild)
        {
            Enqueue(Q,p->lchild);
        }
        if(p->rchild)
        {
            Enqueue(Q,p->rchild);
        }
        Dequeue(Q);
    }
}

int Depth(BiTree T)
{
    if(T==NULL)return 0;
    else
    {
        int m=Depth(T->lchild);
        int n=Depth(T->rchild);
        if(m>n)
        return m+1;
        else
        {
            return n+1;
        }
    }
}

int main()
{
    int n,a;
    BiTree T;
    cout<<"1.创建二叉树(#代表空格)"<<endl;
    cout<<"2.先序遍历二叉树"<<endl;
    cout<<"3.中序遍历二叉树1"<<endl;
    cout<<"4.中序遍历二叉树2"<<endl;
    cout<<"5.后序遍历二叉树"<<endl;
    cout<<"6.层序遍历二叉树"<<endl;
    cout<<"7.求二叉树的深度"<<endl;
    cout<<"8.退出"<<endl;
    while(1)
    {
        cout<<"请输入你的选择:";
        cin>>a;
        switch (a)
        {
            case 1:
                CreateBiTree(T);
                cout<<"操作已完成!"<<endl;
                break;
            case 2:
                cout<<"先序遍历二叉树的顺序为:";
                PreOrderTraverse(T);
                cout<<"\n操作已完成!"<<endl;
                break;
            case 3:
                cout<<"中序递归遍历二叉树的顺序为:";
                InOrderTraverse(T);
                cout<<"\n操作已完成!"<<endl;
                break;
            case 4:
                cout<<"中序不递归遍历二叉树的顺序为:";
                InOrderTree(T);
                cout<<"\n操作已完成!"<<endl;
                break;
            case 5:
                cout<<"后序遍历二叉树的顺序为:";
                PostOrderTraverse(T);
                cout<<"\n操作已完成!"<<endl;
                break;
            case 6:
                cout<<"层序遍历二叉树的顺序为:";
                LevelOrderTree(T);
                cout<<"\n操作已完成!"<<endl;
                break;
            case 7:
                n=Depth(T);
                cout<<"二叉树的深度为:"<<n<<endl;
                break;
            case 8:
                cout<<"本次操作结束!"<<endl;
                exit(0);

        }
    }
    return 0;
}

在这里插入图片描述

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值