二叉樹遍歷-非遞歸-Cpp代碼-後續

#include<iostream>
#include<stack>
using namespace std;  

//定義二叉樹結點鏈式存儲結構
struct BiTNode{
        int data;//數據域
        struct BiTNode *lchild,*rchild;//左右孩子指針
}*BiTree;

//後序遍歷函數聲明
int PostOrder(struct BiTNode *BiTree);

int main()  
{
        //初始化結點
        struct BiTNode node1,node2,node3,node4,node5,node6,node7,node8,node9,node10,node11;
        node1=(struct BiTNode){7,&node2,&node3};
        node2=(struct BiTNode){3,&node4,&node5};
        node3=(struct BiTNode){6,&node6,&node7};
        node4=(struct BiTNode){1,NULL,NULL};
        node5=(struct BiTNode){2,NULL,NULL};
        node6=(struct BiTNode){4,NULL,NULL};
        node7=(struct BiTNode){5,NULL,NULL};

        //建樹
        BiTree=&node1;

        PostOrder(BiTree);
        cout << endl;
        return 0;  
}

//後序遍歷-非遞歸實現
int PostOrder(struct BiTNode *BiTree){
        stack<BiTNode*> s;
        struct BiTNode* p=BiTree;
        struct BiTNode* r=NULL;
        while(p||!s.empty()){
                if(p){ //走到最左邊
                        s.push(p);
                        p=p->lchild;
                }
                else{ //向右
                        p=s.top(); //取棧頂結點
                        if(p->rchild&&p->rchild!=r){ //如果右子樹存在且未被訪問過
                                p=p->rchild; //轉向右
                                s.push(p); //壓入棧
                                p=p->lchild; //再走到最左
                        }else{  //否則,彈出節點並訪問
                                p=s.top();
                                s.pop(); //彈出
                                cout << p->data << " "; //訪問
                                r=p; //記錄最近訪問過的結點
                                p=NULL; //結點訪問完後,重置p指針
                        }

                }//else
        }//while
        return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章