C語言構造並遞迴遍歷二叉樹
阿新 • • 發佈:2019-01-29
#include<stdio.h> #include<malloc.h> #define FALSE 1 #define ERROR 0 #define OK 1 #define ON 0 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; } BiTNode,*BiTree; typedef int Status; BiTree T; Status CreateBiTree(BiTree *T) { char ch; scanf("%c",&ch); if (ch==' ') *T = NULL; else { if (!((*T) = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR; (*T)->data = ch; CreateBiTree(&((*T)->lchild)); // 構造左子樹 CreateBiTree(&((*T)->rchild)); // 構造右子樹 } return OK; } // CreateBiTree int vi(char c) { printf("%c ",c); return OK; } //先序遍歷的遞迴 void PreOrder(BiTree T) { if(T) { vi(T->data); //訪問結點 PreOrder(T->lchild); //遍歷左子樹 PreOrder(T->rchild); //遍歷右子樹 } } //中序遍歷的遞迴 void InOrder(BiTree T) { // 採用二叉連結串列儲存結構,Visit是對資料元素操作的應用函式。 // 中序遍歷二叉樹T的遞迴演算法,對每個資料元素呼叫函式Visit。 if(T) { InOrder(T->lchild); vi(T->data); InOrder(T->rchild); } } // InOrderTraverse //後序遍歷的遞迴 void PostOrder(BiTree T) { // 採用二叉連結串列儲存結構,Visit是對資料元素操作的應用函式。 // 中序遍歷二叉樹T的遞迴演算法,對每個資料元素呼叫函式Visit。 if(T) { PostOrder(T->lchild); PostOrder(T->rchild); vi(T->data); } } // InOrderTraverse int main() { printf("先序輸入二叉樹(空格代表空節點):\n"); CreateBiTree(&T); printf("先序輸出二叉樹:\n"); PreOrder(T); printf("\n"); printf("中序輸出二叉樹:\n"); InOrder(T); printf("\n"); printf("後序輸出二叉樹:\n"); PostOrder(T); printf("\n"); return 0; }
執行結果: