二叉樹非遞迴後序遍歷演算法
阿新 • • 發佈:2019-02-09
與正常的非遞迴中序遍歷演算法不同於兩點:
一 比正常的中序遍歷演算法多了對資料元素的標記。
在壓資料元素入棧(標記記為0,用來表示訪問了其左子樹)時標記,
還有訪問完左子樹利用gettop()獲取雙親通過p=p->rchild進一步訪問右子樹(標記為1,表示訪問了該資料元素的
右子樹)時標記。
二 在訪問完左子樹時,中序遍歷會pop出該元素,利用pop出資料訪問右子樹。而後序遍歷在遍歷完右子樹之後才會pop
出該元素,並訪問其資料,中間的過程是利用getTop函式實現的
void postOrderNoRe(BiTree T) //後續遍歷非遞迴演算法 { BiTree p; Stack *st; initstack(st); p=T; int Tag[20]; //棧,用於標識從左(0)或右(1)返回 while (p!=NULL || !isempty(st)) { while (p!=NULL) { push(st,p); Tag[st->top]=0; p=p->lchild; } while (!isempty(st)&&Tag[st->top]==1) { //注意這裡使用的是while,也就是說不停迴圈把棧裡連續標記為1的節點都輸出來 //通過上面的函式訪問完右子樹之後才會訪問該節點的資料 //所以這個輸出函式必須放在這裡,下面的函式用來由訪問左子樹轉 //為訪問其右子樹。而上面的函式用來判斷右子樹是否訪問結束 p=pop(st); cout<<p->data<<" "; } if (!isempty(st)) { p=gettop(st); p=p->rchild; Tag[st->top]=1; //設定標記右子樹已經訪問 } else break; } }