資料結構實驗之二叉樹的遍歷
阿新 • • 發佈:2019-02-10
【實驗內容】
建立一個二叉樹,對這棵動態二叉樹進行分析,將其用靜態二叉連結串列表示。二叉樹的動態二叉連結串列結構中的每個結點有三個欄位: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);
}