1. 程式人生 > >資料結構實驗之二叉樹的遍歷

資料結構實驗之二叉樹的遍歷

【實驗內容】

建立一個二叉樹,對這棵動態二叉樹進行分析,將其用靜態二叉連結串列表示。二叉樹的動態二叉連結串列結構中的每個結點有三個欄位: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); }