二叉樹--後序遍歷的非遞迴演算法
阿新 • • 發佈:2018-12-17
後續遍歷關鍵在於,當節點的 右子樹存在且被訪問後 或者是 右子樹為空 才能訪問自身。
在遍歷過程中,先將節點從的左孩子到最左節點壓棧, 設定標誌變數 flag 來判斷是否訪問過左孩子, pre指標來指向先前訪問過的節點。
所有左孩子壓棧後, 最後一個節點的左孩子為空,已被訪問p = NULL , 令flag=1
當左孩子被訪問時,進入迴圈,取棧頂節點。
1. 當棧頂節點的右孩子 等於 空 或 前一個被訪問的節點 時, 訪問該節點, 令pre 等於當前節點,pre = p, 當前節點出棧。
2. 當棧頂節點的右孩子不為空時, 繼續遍歷以右孩子為根節點的右子樹。
1 Status PostOrderTraverse(BiTree T){2 BiTree p = T, S[100], pre; 3 int top = 0, flag = 1; 4 if(p) 5 do{ 6 while(p){ 7 S[top++] = p; 8 p = p->lchild; 9 } 10 // p所有左節點入棧 11 flag = 1; 12 13 while(top != 0 && flag == 1){ 14 p = S[top-1]; 15 if(p->rchild == pre || p->rchild == NULL){ 16 //右孩子不存在或右孩子已訪問 17 top--; 18 printf("%c ", p->data); 19 pre = p; 20 //指向被訪問節點 21 }22 else{ 23 //繼續遍歷右子樹 24 p = p->rchild; 25 flag = 0; 26 } 27 } 28 }while(top != 0); 29 return OK; 30 }//PostOrderTraverse
完整程式碼:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define TElemType char 5 #define Status int 6 #define OK 1 7 8 typedef struct BiTNode{ 9 TElemType data; 10 struct BiTNode *lchild, *rchild; 11 }BiTNode, *BiTree; 12 13 Status CreateBiTree(BiTree &T){ 14 TElemType ch = getchar(); 15 if(ch == '#') T = NULL; 16 else{ 17 T = (BiTree)malloc(sizeof(BiTNode)); 18 T->data = ch; 19 CreateBiTree(T->lchild); 20 CreateBiTree(T->rchild); 21 } 22 return OK; 23 }//CreateBiTree 24 25 Status PostOrderTraverse(BiTree T){ 26 BiTree p = T, S[100], pre=NULL; 27 int top = 0, flag = 1; 28 if(p) 29 do{ 30 while(p){ 31 S[top++] = p; 32 p = p->lchild; 33 } 34 35 flag = 1; 36 37 while(top != 0 && flag == 1){ 38 p = S[top-1]; 39 if(p->rchild == pre || p->rchild == NULL){ 40 top--; 41 printf("%c ", p->data); 42 pre = p; 43 } 44 else{ 45 p = p->rchild; 46 flag = 0; 47 } 48 } 49 }while(top != 0); 50 return OK; 51 }//PostOrderTraverse 52 53 int main(){ 54 BiTree T; 55 CreateBiTree(T); 56 PostOrderTraverse(T); 57 return 0; 58 }View Code