数据结构实践教程——二叉树实验

一、实验要求:
实现二叉树的先序、中序、后序遍历,并将其转换为静态二叉链表。

二、代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define N 20

typedef struct BiTNode
{
    char data;//结点数据
    struct BiTNode *lchild,*rchild;//左右孩子指针
    int index;
}*BiTree;

typedef struct StBiTNode
{
    char data;
    int lchild;
    int rchild;
}StBiTree;

static int i=0;

//创建二叉树
void CreateBiTree(BiTree *T)
{
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        *T=NULL;
    else
    {
        *T=(BiTree)malloc(sizeof(BiTNode));
        if(!*T)
            exit(-1);
        (*T)->data=ch;//生成根结点
        (*T)->index=i++;
        CreateBiTree(&(*T)->lchild);//构造左子树
        CreateBiTree(&(*T)->rchild);//构造右子树
    }
}

//先序遍历二叉树
void PreOrderTraverse(BiTree T)
{
    if(T==NULL)
        return;
    printf("%c",T->data);//显示结点数据
    PreOrderTraverse(T->lchild);//再先序遍历左子树
    PreOrderTraverse(T->rchild);//最后先序遍历右子树
}

//中序遍历二叉树
void InOrderTraverse(BiTree T)
{
    if(T==NULL)
        return;
    InOrderTraverse(T->lchild);//中序遍历左子树
    printf("%c",T->data);//显示结点数据
    InOrderTraverse(T->rchild);//最后中序遍历右子树
}

//后序遍历二叉树
void PostOrderTraverse(BiTree T)
{
    if(T==NULL)
        return;
    PostOrderTraverse(T->lchild);//先后序遍历左子树
    PostOrderTraverse(T->rchild);//再后序遍历右子树
    printf("%c",T->data);//显示结点数据
}

static int j=0;

void turn(BiTree T,StBiTNode a[])//将动态二叉树转换成静态二叉链表
{
    if(T)
        a[j].data=T->data;
    if(T->lchild==NULL)
        a[j].lchild=-1;
    else
        a[j].lchild=T->lchild->index;
    if(T->rchild==NULL)
        a[j].rchild=-1;
    else
        a[j].rchild=T->rchild->index;
    j++;
    if(T->lchild!=NULL)
        turn(T->lchild,&a[0]);
    if(T->rchild!=NULL)
        turn(T->rchild,&a[0]);
}

int main()
{
    BiTNode *BiTree;
    StBiTNode a[N];
    printf("请输入二叉树的结点数据,当为空时用#代替:");
    CreateBiTree(&BiTree);
    printf("\n");

    printf("先序遍历:");
    PreOrderTraverse(BiTree);
    printf("\n");
    printf("中序遍历:");
    InOrderTraverse(BiTree);
    printf("\n");
    printf("后序遍历:");
    PostOrderTraverse(BiTree);
    printf("\n\n");

    turn(BiTree,&a[0]);
    printf("转换为静态二叉链表(-1表示为空):\n");
    printf("i\tdata\tlchild\trchild\t\n");
    int m;
    for(m=0;m<i;m++)
    printf("%d\t%c\t%d\t%d\n",m,a[m].data,a[m].lchild,a[m].rchild);
    return 0;
}

三、实验测试
测试用例:
在这里插入图片描述
运行结果:
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值