今天寫的是二叉樹操作的實驗,這個實驗有三個部分:
①建立二叉樹,采用二叉鏈表結構
②先序、中序、后續遍歷二叉樹,輸出節點值
③銷毀二叉樹
二叉樹的節點結構定義
typedef struct BiTNode //二叉樹的節點結構
{
char data; //此處用char 因為數據設用字母
struct BiTNode * Lchild, * Rchild; //左右孩子指針
} BiTree;
基本操作函數定義部分
BiTree * CreateBiTree(BiTree * T); //創建二叉樹 void PreOrderT(BiTree * T); //先序遍歷 void InOrderT(BiTree * T); //中序遍歷 void PostOrder(BiTree * T); //后序遍歷 void DestroyBiTree(BiTree * T); //銷毀二叉樹
函數實現部分
BiTree * CreateBiTree(BiTree * T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
return 0; //輸入#表示為空節點
//因為傳進來的參數是一個樹節點的指針,所以下面這句代碼可以理解成實例化該指針指向的樹節點
T =(BiTree *)malloc(sizeof(BiTree));
T->data=ch; //給節點的數據域賦值
T->Lchild=CreateBiTree(T->Lchild); //遞歸創建左子樹
T->Rchild=CreateBiTree(T->Rchild); //遞歸創建右子樹
return T;
}
void PreOrderT(BiTree * T)
{
if(T) //如果該樹節點存在
{
printf("%c",T->data); //先序遍歷
PreOrderT(T->Lchild);
PreOrderT(T->Rchild);
}
}
void InOrderT(BiTree * T)
{
if(T) //如果該樹節點存在
{
InOrderT(T->Lchild); //中序遍歷
printf("%c",T->data);
InOrderT(T->Rchild);
}
}
void PostOrder(BiTree * T)
{
if(T) //如果該樹節點存在
{
PostOrder(T->Lchild);
PostOrder(T->Rchild);
printf("%c",T->data);
}
}
void DestroyBiTree(BiTree * T)
{
if(T) //如果T存在
{
DestroyBiTree(T->Lchild);
DestroyBiTree(T->Rchild);
free(T);
}
}
主函數測試部分
int main(void)
{
BiTree * T; //先定義一個樹節點指針,指向第一個樹節點,也就是根節點
printf("請輸入二叉樹的數據,並以#為空節點\n");
T=CreateBiTree(T);
printf("該樹的先序遍歷結果為:");
PreOrderT(T);
printf("\n");
printf("該樹的中序遍歷結果為:");
InOrderT(T);
printf("\n");
printf("該樹的后序遍歷結果為:");
PostOrder(T);
printf("\n");
DestroyBiTree(T);
return 0;
}
效果圖:

好了,這天真冷。。。呼呼
gg,又不夠字數,老規矩,湊字數
山不在高,有仙則名。水不在深,有龍則靈。斯是陋室,惟吾德馨。苔痕上階綠,草色入簾青。談笑有鴻儒,往來無白丁。可以調素琴,閱金經。無絲竹之亂耳,無案牘之勞形。南陽諸葛廬,西蜀子雲亭。孔子雲:何陋之有?
