1 #include <stdio.h> 2 #include <stdlib.h> 3 //*****二叉樹的二叉鏈表存儲表示*****// 4 typedef struct BiNode 5 { 6 char data; 7 struct BiNode *lchild, *rchild; 8 }BiNode, *BiTree; 9 10 //*****按先序次序輸入二叉樹中結點的值(一個字符),空格字符表示空樹構造二叉鏈表表示的二叉樹T*****// 11 void CreateBiTree(BiTree &T) 12 { 13 char ch; 14 scanf("%c", &ch); 15 if(ch == ' ') 16 { 17 T = NULL; 18 } 19 else 20 { 21 if(!(T = (BiNode *)malloc(sizeof(BiNode)))) 22 { 23 return; 24 } 25 T->data = ch; //生成根結點 26 CreateBiTree(T->lchild); //構造左子樹 27 CreateBiTree(T->rchild); //構造右子樹 28 } 29 30 return; 31 } 32 33 //*****先序遍歷二叉樹*****// 34 void PreOrderTraverse(BiTree T) 35 { 36 if(!T) 37 { 38 return; //若T為空樹,則直接返回 39 } 40 printf("%c ", T->data); //訪問根結點 41 PreOrderTraverse(T->lchild); //先序遍歷左子樹 42 PreOrderTraverse(T->rchild); //先序遍歷右子樹 43 44 return; 45 } 46 47 //*****中序遍歷二叉樹*****// 48 void InOrderTraverse(BiTree T) 49 { 50 if(!T) 51 { 52 return; //若T為空樹,則直接返回 53 } 54 InOrderTraverse(T->lchild); //中序遍歷左子樹 55 printf("%c ", T->data); //訪問根結點 56 InOrderTraverse(T->rchild); //中序遍歷右子樹 57 58 return; 59 } 60 61 //*****後序遍歷二叉樹*****// 62 void PostOrderTraverse(BiTree T) 63 { 64 if(!T) 65 { 66 return; //若T為空樹,則直接返回 67 } 68 PostOrderTraverse(T->lchild); //後序遍歷左子樹 69 PostOrderTraverse(T->rchild); //後序遍歷右子樹 70 printf("%c ", T->data); //訪問根結點 71 72 return; 73 } 74 75 int main(void) 76 { 77 BiTree T; 78 printf("請按先序次序輸入二叉樹中結點的值(字符),空格字符表示空樹:\n"); 79 CreateBiTree(T); 80 81 printf("先序遍歷結果為:"); 82 PreOrderTraverse(T); 83 printf("\n\n"); 84 85 printf("中序遍歷結果為:"); 86 InOrderTraverse(T); 87 printf("\n\n"); 88 89 printf("後序遍歷結果為:"); 90 PostOrderTraverse(T); 91 printf("\n\n"); 92 93 return 0; 94 }
以如下二叉樹為例,給出按先序次序輸入二叉樹中結點的值(字符),從而按照本文給出的算法構造二叉樹。
輸入字符的順序是:-+a空格空格*b空格空格-c空格空格d空格空格/e空格空格f空格空格,即可驗證本文提供的遍歷算法。