用堆疊實現後序遍歷的非遞迴程式
阿新 • • 發佈:2019-02-08
藉助堆疊可以實現前序遍歷、中序遍歷的非遞迴程式,而且兩者的程式結構幾乎一樣。
那麼,是否也可以藉助堆疊實現後序遍歷的非遞迴程式?是不是挪動一下printf語句就可以了?
(通過給節點增加訪問次數的屬性來實現,虛擬碼如下)
void PostOrderTraversal(Bintree BT) { //給節點增加訪問次數的屬性Visit,初始化為0
Bintree T BT;
Stack S = CreateStack(Maxsize);
while (T || !IsEmpty(S)) {
while (T) {
if (T-> Visit == 0) {//雖然沒必要判斷,為便於理解
T->Visit++;
Push(S, T); //第一次入棧,不訪問
}
T = T->left; //轉向左子樹
}
if (!IsEmpty(S)) {
T = Pop(s);
if (T->Visit == 2) {
printf("%d", T->Data);//第三次碰到它,訪問節點,可以徹底從堆疊彈出了
T = NULL;//左右子數均已經訪問過
}
else {
T->Visit++;
Push(S, T); //第二次入棧,不訪問,(相當於T沒有出棧)
T = T->Right; //轉向右子樹
}
}
}