非遞歸后序遍歷

一、算法

第一步:先調(diào)用循環(huán)遍歷左子樹,同時(shí)入棧元素。
第二步:左子樹調(diào)用完成之后,訪問??臻g,對于棧頂元素判斷是否訪問過右子樹
??①若未訪問:則將p指針指向右子樹,然后對右子樹進(jìn)行 第一步 。
??②若已訪問:則棧頂元素出棧,并打印內(nèi)容
第三步:循環(huán)上述過程,直到棧為空

二、代碼

1、結(jié)構(gòu)體定義:

typedef struct node {
    int data;
    node *l;
    node *r; 
    bool vis;//是否訪問過右子樹
}*Tree,node; 

2、非遞歸后序遍歷函數(shù)

void stPrint(Tree tree) {
    node *p = tree;
    stack<node *> s;
    do {
        while(p!=NULL) {
            p->vis = false;
            s.push(p);
            p = p->l;
        }
        while(!s.empty()) {
            node *top = s.top();
            if(top->vis == true) {//已經(jīng)訪問過右子樹了 
                cout << top->data << " ";
                s.pop();
            } else {//右子樹還沒訪問 
                p = top->r;
                top->vis = true;
                break;
            }
        }
    } while(!s.empty());
}

三、參考視頻

二叉樹后序遍歷非遞歸 https://www.bilibili.com/video/BV1up411R7NB?t=752

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容