【实验内容】
创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段: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);
}