今天寫的是二叉樹操作的實驗,這個實驗有三個部分:
①建立二叉樹,采用二叉鏈表結構
②先序、中序、后續遍歷二叉樹,輸出節點值
③銷毀二叉樹
二叉樹的節點結構定義
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,又不夠字數,老規矩,湊字數
山不在高,有仙則名。水不在深,有龍則靈。斯是陋室,惟吾德馨。苔痕上階綠,草色入簾青。談笑有鴻儒,往來無白丁。可以調素琴,閱金經。無絲竹之亂耳,無案牘之勞形。南陽諸葛廬,西蜀子雲亭。孔子雲:何陋之有?