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

【实验内容】

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

#include<stdio.h>

#include<stdlib.h>

//二叉树结点定义

typedef struct BITNode{

char  data;

struct BITNode *lchild,*rchild;

}BITNode,*BITree;

static int length=0;//二叉树结点个数



//静态二叉链表

typedef struct ATNode{

char  data;

int lchild;

int rchild;

}ATNode;

ATNode  Array[100];//存储二叉链表结点

//先序创建二叉树

void CreateBITree(BITree *T)

{

char ch;

scanf("%c",&ch);

if(ch=='#')

*T=NULL;

else

{

*T=(BITree )malloc(sizeof(BITNode));

       (*T)->data=ch;

CreateBITree(&((*T)->lchild));

CreateBITree(&((*T)->rchild));

}

}

//先序遍历二叉树

void VisitBitree(BITree T)

{

if(T)

{

printf("%c->",T->data); 

length++;

Array[length].data=T->data;

VisitBitree(T->lchild);//访问左孩子

VisitBitree(T->rchild);//访问右孩子

}

}

//二叉树转化为静态二叉链表

void BitreeTransform(BITree T)

{

int i,j;

if(T)

{

j=1;

        while(T->data!=Array[j].data)

j++;//确定T结点的数组下标

if(T->lchild!=NULL)

{

i=1;

while(T->lchild->data!=Array[i].data)

i++;//确定T->lchild结点的数组下标

            Array[j].lchild=i;

}

else

Array[j].lchild=0;

if(T->rchild!=NULL)

{

i=1;

while(T->rchild->data!=Array[i].data)

i++;//确定T->rchild结点的数组下标

            Array[j].rchild=i;

}

else

Array[j].rchild=0;

BitreeTransform(T->lchild);

BitreeTransform(T->rchild);

}

}

void main ()

{

printf("请先序方式输入二叉树的节点值:\n");

BITree T=NULL;//T为空二叉树

CreateBITree(&T);//创建一棵二叉树

printf("按先序次序输出二叉树节点中的值:\n"); 

        VisitBitree(T);

printf("\n\n");

    BitreeTransform(T);

printf("二叉树的静态二叉链表为:\n");

printf("下标\tlchil\tddata\trchild\n");

for(int j=1;j<=length;j++) 

{ 

      printf("%d\t%d\t%c\t%d\n", j,Array[j].lchild, Array[j].data, Array[j].rchild); 

} 

printf("二叉静态链表长度:%d\n",length);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值