後序遍歷非遞迴演算法
阿新 • • 發佈:2019-01-06
演算法1
void postrav1(struct btnode *bt) { struct btnode *p; struct { struct btnode *pt; int tag; }st[MaxSize]; } int top=-1; top++; st[top].pt=bt; st[top].tag=1; while(top>-1) /*棧不為空*/ { if(st[top].tag==1) /*不能直接訪問的情況*/ { p=st[top].pt; top--; if(p!=NULL) { top++; /*根結點*/ st[top].pt=p; st[top].tag=0; top++; /*右孩子結點*/ st[top].pt=p->p->rchild; st[top].tag=1; top++; /*左孩子結點*/ st[top].pt=p->lchild; st[top].tag=1; } } if(st[top].tag==0) /*直接訪問的情況*/ { printf("%d ",st[top].pt->d); top--; } } }
演算法2
void postrav2(struct btnode *bt) { struct btnode *st[MaxSize],*p; int flag,top=-1; if(bt!=NULL) { do { while(bt!=NULL) { top++; st[top]=bt; bt=bt->lchild; } p=NULL; flag=1; while(top!=-1 && flag) { bt=st[top]; if(bt->rchild==p) { printf("%d ",bt->d); top--; p=bt; } else { bt=bt->rchild; flag=0; } } }while(top!=-1) printf("\n"); } }
http://baike.baidu.com/view/1490835.html?wtp=tt