数据结构实验上机二叉树

数据结构二叉树的遍历实验上机

一、【实验目的】
1、 了解二叉树的前序、中序、后序和层次序列排列;
2、 将C语言同二叉树的数据结构联系起来;
3、 掌握生成的二叉树的链表结构;
4、 掌握如何按层次输出二叉树的所有结点;
5、 掌握如何将动态二叉树转换为静态二叉链表。

二、【实验内容】
创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段:data,lchild,rchild。静态二叉链表是用数组作为存储空间,每个数组元素存储二叉树的一个结点,也有三个字段:data,lchild,rchild。lchild和rdhild分别用于存储左右孩子的下标。

三、【实验步骤与要求】
1、实验前的准备
(1)了解二叉树的基本概念;
(2)了解二叉树的基本结构。
2、上机操作
(1)了解二叉树的前序、中序、后序和层次排列;
(2) 将C语言同二叉树的数据结构联系起来;
(3) 掌握生成的二叉树的链表结构;
(4) 掌握如何按层次输出二叉树的所有结点;
(5) 掌握如何将动态二叉树转换为静态二叉链表。

#include<stdio.h>
#include<stdlib.h>
static int length=0;//二叉树结点个数

typedef struct Array//静态二叉链表节点
{
    char data;
    int lchild; //存左孩子的下标
    int rchild; //存右孩子的下标
}Array;
Array Tree[20];//空的静态二叉树

typedef struct BiTNode //动态二叉链表节点
{
    char data;
    struct BiTNode *lchild,*rchild;//指向左右孩子的指针
}BiTNode,*BiTree;

BiTree CreateBiTree()//按先序构造动态二叉树,空格表示空树
{
    char ch;
    BiTree T;
    scanf("%c",&ch);
    if(ch=='#')
        T=NULL; //'#'表示空树
    else
    {
    T=(BiTree)malloc(sizeof(BiTNode));
    T->data=ch; //为根数据域赋值
    T->lchild=CreateBiTree();//为左孩子数据域赋值
    T->rchild=CreateBiTree();//为右孩子数据域赋值
    }
    return T;
}

//先序遍历,递归实现
void PreTraversingBiTree(BiTree T)
{
    if(T)
    {
    printf("%c",T->data);
    PreTraversingBiTree(T->lchild);
    PreTraversingBiTree(T->rchild);
    }
}

//中序遍历,递归实现
void MidTraversingBiTree(BiTree T)
{
    if(T)
    {
    MidTraversingBiTree(T->lchild);
    printf("%c",T->data);
    MidTraversingBiTree(T->rchild);
    }
}

//后序遍历,递归实现
void PostTraversingBiTree(BiTree T)
{
    if(T)
    {
    PostTraversingBiTree(T->lchild);
    PostTraversingBiTree(T->rchild);
    printf("%c",T->data);
    }
}

//求最大层数
int Maxdepth(BiTree T)
{
    int left=0,right=0;
    if(T)
    {
    left=Maxdepth(T->lchild); //向左的最大层数
    right=Maxdepth(T->rchild); //向右的最大层数
    }
    return 1+(left>=right?left:right);
}

//层序遍历
void LevelTraversing(BiTree T,int level)//每层从左向右遍历
{
    if(T)
    {
        if(level==1)
        {
        printf("%c",T->data);
        Tree[++length].data=T->data;//层序遍历的同时给静态表赋值
        }
        else
        {
        LevelTraversing(T->lchild,--level);
        LevelTraversing(T->rchild,level);
        }
    }
}

void LevelTraversingBiTree(BiTree T)//每层调用遍历函数
{
    int i=1;
    if(T)
        for(i;i<=Maxdepth(T);i++)
            LevelTraversing(T,i);
}

void BitreeTransform(BiTree T)//动态二叉树转换为静态二叉树
{
    int i,j;
    if(T)
    {
        for(j=1;T->data!=Tree[j].data;j++);//确定T结点的数组下标
            if(T->lchild!=NULL)
            {
            for(i=1;T->lchild->data!=Tree[i].data;i++);
                Tree[j].lchild=i; //寻找并确定左孩子结点的数组下标
            }
            else
                Tree[j].lchild=0; //没找到说明没有左孩子
        if(T->rchild!=NULL)
        {
            for(i=1;T->rchild->data!=Tree[i].data;i++);
                Tree[j].rchild=i; //寻找并确定右孩子结点的数组下标
        }
        else
            Tree[j].rchild=0; //没找到说明没有右孩子
        BitreeTransform(T->lchild);
        BitreeTransform(T->rchild);
    }
}

int main()
{
    printf("请输入数据:\n");
    BiTree T;
    T=CreateBiTree();
    printf("前序遍历:\t");
    PreTraversingBiTree(T);printf("\n");
    printf("中序遍历:\t\t");
    MidTraversingBiTree(T);printf("\n");
    printf("后序遍历:\t\t");
    PostTraversingBiTree(T);printf("\n");
    printf("层序遍历:\t");
    LevelTraversingBiTree(T);printf("\n\n");
    BitreeTransform(T);
    printf("转为静态二叉树后:\n");
    printf("index\tlchild\tdata\trchild\n");
    for(int j=1;j<=length;j++)
    printf("%d\t%d\t%c\t%d\n",j,Tree[j].lchild,Tree[j].data,Tree[j].rchild);
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值