1. 程式人生 > >二叉樹的遞迴遍歷(先序、中序和後序)

二叉樹的遞迴遍歷(先序、中序和後序)

  [前文]

  二叉樹的遞迴遍歷包括 先序遍歷、中序遍歷 和 後續遍歷

  如下圖所示的二叉樹:

    

  前序遍歷順序為:ABCDE  (先訪問根節點,然後先序遍歷其左子樹,最後先序遍歷其右子樹)

  中序遍歷順序為:CBDAE  (先中序遍歷其左子樹,然後訪問很節點,最後中序遍歷其右子樹)

  後續遍歷順序為:CDBEA  (先後序遍歷其左子樹,然後後續其右子樹,最後訪問根節點)

 

  不多說,直接上程式碼。

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
4 // 二叉樹的儲存結構 5 typedef char ElementType; 6 typedef struct TreeNode *PtrToNode; 7 struct TreeNode { 8 ElementType Data; 9 PtrToNode Left; 10 PtrToNode Right; 11 }; 12 typedef PtrToNode BinTree; 13 14 BinTree CreateBinTree(BinTree T); 15 void PreOrderTraverse(BinTree T); 16 void InOrderTraverse(BinTree T);
17 void PostOrderTraverse(BinTree T); 18 19 int main() 20 { 21 BinTree T; 22 T = CreateBinTree(T); 23 24 printf("PreOrderTraverse: \n"); 25 PreOrderTraverse(T); 26 printf("\n"); 27 28 printf("InOrderTraverse: \n"); 29 InOrderTraverse(T); 30 printf("\n"); 31 32
printf("PostOrderTraverse: \n"); 33 PostOrderTraverse(T); 34 printf("\n"); 35 36 return 0; 37 } 38 // 建立二叉樹 39 BinTree CreateBinTree(BinTree T) 40 { 41 char c; 42 scanf("%c", &c); 43 if ( c != '#' ) { 44 T = (BinTree)malloc(sizeof(struct TreeNode)); 45 T->Data = c; 46 T->Left = CreateBinTree(T->Left); 47 T->Right = CreateBinTree(T->Right); 48 } else { 49 T = NULL; 50 } 51 return T; 52 } 53 // 先序遍歷 54 void PostOrderTraverse(BinTree T) 55 { 56 if ( T ) { 57 PostOrderTraverse(T->Left); 58 PostOrderTraverse(T->Right); 59 printf("%c ", T->Data) 60 ; } 61 } 62 // 中序遍歷 63 void InOrderTraverse(BinTree T) 64 { 65 if ( T ) { 66 InOrderTraverse(T->Left); 67 printf("%c ", T->Data); 68 InOrderTraverse(T->Right); 69 } 70 } 71 // 後序遍歷 72 void PreOrderTraverse(BinTree T) 73 { 74 if ( T ) { 75 printf("%c ", T->Data); 76 PreOrderTraverse(T->Left); 77 PreOrderTraverse(T->Right); 78 } 79 }

  執行結果: