二叉樹--后序遍歷的非遞歸算法


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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM