1. 程式人生 > >用堆疊實現後序遍歷的非遞迴程式

用堆疊實現後序遍歷的非遞迴程式

藉助堆疊可以實現前序遍歷、中序遍歷的非遞迴程式,而且兩者的程式結構幾乎一樣。
那麼,是否也可以藉助堆疊實現後序遍歷的非遞迴程式?是不是挪動一下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; //轉向右子樹 } } }