二叉樹的建立和遍歷都要用到遞歸,先暫時保存一下代碼,其中主要是理解遞歸的思想,其它的就都好理解了。這里是三種遍歷方式,其實理解一種,其它的幾個就都理解了,就是打印出來的順序不一樣而已。建立和遍歷的方式差不多。也分好幾種方式建立,這里 就寫一種,就是先序建立
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct TreeNode{ 5 char ch; 6 struct TreeNode *lchild, *rchild; 7 }Tree, *PTree;//定義樹節點的結構體 8 void createBiTree(PTree *p)//建立二叉樹 9 { 10 char ch; 11 scanf("%c", &ch); 12 getchar();//此時%c讀取的是單個字符,所以用那個getchar來接收一下 13 if(ch == '#') 14 *p = NULL; 15 else 16 { 17 *p = (PTree)malloc(sizeof(Tree)); 18 (*p) -> ch = ch; 19 printf("請輸入%c的左子樹\n", ch); 20 createBiTree(&(*p) -> lchild); 21 printf("請輸入%c的右子樹\n", ch); 22 createBiTree(&(*p) -> rchild); 23 } 24 25 } 26 void preOrderTraverse(PTree p)//前序遍歷 27 { 28 if(p == NULL) 29 return ; 30 printf("%c ", p -> ch); 31 preOrderTraverse(p -> lchild); 32 preOrderTraverse(p -> rchild); 33 } 34 void InOrderTraverse(PTree p)//中序遍歷 35 { 36 if(p == NULL) 37 return; 38 InOrderTraverse(p -> lchild); 39 printf("%c ", p -> ch); 40 InOrderTraverse(p -> rchild); 41 } 42 void BackOrderTraverse(PTree p)//后續遍歷 43 { 44 if(p == NULL) 45 return ; 46 BackOrderTraverse(p -> lchild); 47 BackOrderTraverse(p -> rchild); 48 printf("%c ", p -> ch); 49 } 50 int main() 51 { 52 PTree pt; 53 createBiTree(&pt); 54 preOrderTraverse(pt); 55 printf("\n"); 56 InOrderTraverse(pt); 57 printf("\n"); 58 BackOrderTraverse(pt); 59 printf("\n"); 60 return 0; 61 }