郝斌資料結構入門--P75-鏈式二叉樹具體遍歷程式演示
阿新 • • 發佈:2018-11-18
郝斌資料結構入門--P75-鏈式二叉樹具體遍歷程式演示
知道遞迴的實現與應用,二叉樹的遍歷就容易了。
程式碼如下:
#include <stdio.h> #include <malloc.h> struct BTNode { char data; struct BTNode *pLchild; //p是指標 L是左 child是孩子 struct BTNode *pRchild; }; struct BTNode *CreateBTree(void); void PreTraverseBTree(struct BTNode *pT); void InTraverseBTree(struct BTNode *pT); void PostTraverseBTree(struct BTNode *pT); int main(void) { //原始二叉樹: // A // B C // D // E // struct BTNode *pT = CreateBTree();//返回根節點地址 //線性輸出 //先序 //PreTraverseBTree(pT);//ABCDE //中序 //InTraverseBTree(pT);//BADEC //後序 PostTraverseBTree(pT);//BEDCA return 0; } //後序遍歷 void PostTraverseBTree(struct BTNode *pT) { //用根節點pT代表整一棵樹 //用pT->pLchild可以代表整個左子樹 if (NULL != pT)//防止 pT->pLchild和pT->pRchild為空 { //先先序訪問左子樹 if (NULL != pT->pLchild) { PostTraverseBTree(pT->pLchild); } //再先序訪問右子樹 if (NULL != pT->pRchild) { PostTraverseBTree(pT->pRchild); } //再先訪問根節點 printf("%c\n", pT->data);//pT就是根 } } //中序遍歷 void InTraverseBTree(struct BTNode *pT) { //用根節點pT代表整一棵樹 //用pT->pLchild可以代表整個左子樹 if (NULL != pT)//防止 pT->pLchild和pT->pRchild為空 { //先先序訪問左子樹 if (NULL != pT->pLchild) { InTraverseBTree(pT->pLchild); } //再先訪問根節點 printf("%c\n", pT->data);//pT就是根 //再先序訪問右子樹 if (NULL != pT->pRchild) { InTraverseBTree(pT->pRchild); } } } //先序遍歷 void PreTraverseBTree(struct BTNode *pT) { //用根節點pT代表整一棵樹 //用pT->pLchild可以代表整個左子樹 if (NULL != pT)//防止 pT->pLchild和pT->pRchild為空 { //先訪問根節點 printf("%c\n", pT->data);//pT就是根 //再先序訪問左子樹 if (NULL != pT->pLchild) { PreTraverseBTree(pT->pLchild);//訪問左子樹 } //再先序訪問右子樹 if (NULL != pT->pRchild) { PreTraverseBTree(pT->pRchild);//訪問右子樹 } } } struct BTNode *CreateBTree(void) { //靜態樹,規定好的 struct BTNode *pA = (struct BTNode *)malloc(sizeof(struct BTNode)); struct BTNode *pB = (struct BTNode *)malloc(sizeof(struct BTNode)); struct BTNode *pC = (struct BTNode *)malloc(sizeof(struct BTNode)); struct BTNode *pD = (struct BTNode *)malloc(sizeof(struct BTNode)); struct BTNode *pE = (struct BTNode *)malloc(sizeof(struct BTNode)); pA->data = 'A'; pB->data = 'B'; pC->data = 'C'; pD->data = 'D'; pE->data = 'E'; pA->pLchild = pB; pA->pRchild = pC; pB->pLchild = pB->pRchild = NULL; pC->pLchild = pD; pC->pRchild = NULL; pD->pLchild = NULL; pD->pRchild = pE; pE->pLchild = pE->pRchild = NULL; return pA;//返回根節點地址 }