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