1. 程式人生 > >二叉樹--後序遍歷的非遞迴演算法

二叉樹--後序遍歷的非遞迴演算法

後續遍歷關鍵在於,當節點的  右子樹存在且被訪問後  或者是  右子樹為空  才能訪問自身。

在遍歷過程中,先將節點從的左孩子到最左節點壓棧, 設定標誌變數 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