老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

二叉樹之非遞歸遍歷

1、二叉樹的遍歷

目前創新互聯已為上千的企業提供了網站建設、域名、雅安服務器托管綿陽服務器托管、企業網站設計、紹興網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。

  為什么要有遍歷操作:將線性結構-------->非線性結構;

      將遞歸程序-------->非遞歸程序;

2、二叉樹的三種遞歸遍歷:

  先序遍歷:先訪問根(父)結點,在訪問左分支,最后訪問右分支;

  中序遍歷:先訪問左分支,在根結點,最后右分支;

  后序遍歷:先訪問左分支,在訪問右分支,最后訪問根節點;

二叉樹之非遞歸遍歷

所有程序皆正確測試過,后面將給完整程序和測試程序,測試結果。

以下就是遞歸遍歷,先序,中序,后序:

下面的都是在類外定義的函數,所以為模板函數:

//先序遍歷
template
void BinTree::prevOrder(BinTreeNode *t)const{
    if(t == NULL){
        return;
    }else{
        cout<data<<" ";
        prevOrder(t->leftChild);
        prevOrder(t->rightChild);
    }
}
//中序遍歷
template
void BinTree::inOrder(BinTreeNode *t)const{
    if(t == NULL){
        return;
    }else{
        inOrder(t->leftChild);
        cout<data<<" ";
        inOrder(t->rightChild);
    }
}
//后序遍歷
template
void BinTree::endOrder(BinTreeNode *t)const{
    if(t == NULL){
        return;
    }else{
        endOrder(t->leftChild);
        endOrder(t->rightChild);
        cout<data<<" ";
    }
}

3、二叉樹的4種非遞歸遍歷

  (1)、深度優先用棧

  先序的非遞歸遍歷:棧先入后出,根結點入棧,棧不空,出棧訪問,此時將右孩子入棧,在將左孩子入棧,棧不空,出棧訪問,就是循環了;

  代碼如下:

template
void BinTree::prevOrder_1(BinTreeNode* t)const{
    stack *> st;  //棧里面放的是指向節點的指針
    BinTreeNode *tmp;

    if(t != NULL){   //根不為空
        st.push(t);  //根入棧
        while(!st.empty()){  //棧非空
            tmp = st.top();  //讀棧頂元素
            st.pop();        //出棧
            cout<data<<" ";  //訪問
            if(tmp->rightChild){    //右孩子存在
                st.push(tmp->rightChild);  //入棧
            }
            if(tmp->leftChild){     //左孩子存在
                st.push(tmp->leftChild);  //入棧
            }
        }
    }
}

  中序的非遞歸遍歷:就是先把根及左分支一直壓棧,棧不空,出棧訪問,再看右孩子,有的話,壓棧,結束條件想清楚就行。

  代碼如下:

template
void BinTree::inOrder_1(BinTreeNode* t)const{
    stack *> st;  //棧里面放的是指向節點的指針
    BinTreeNode *p = t;
                     //用的是do while()循環
    do{
        while(p != NULL){  //將根和左子樹一直入棧
            st.push(p);
            p = p->leftChild;
        }
        if(!st.empty()){  //棧不空,
            p = st.top();  //讀棧頂元素
            st.pop();      //出棧
            cout<data<<" ";  //訪問
            p = p->rightChild;   //此時往剛才棧頂元素的右孩子走;
        }             //中序遍歷時,當root出棧時,此時棧空,沒有p!=NULL的話,將出錯。
    }while(p != NULL || !st.empty()); //為根的時候右邊還要入棧。
}

  后序的非遞歸遍歷:思想就是要有一個標志,當為右邊回來的時候才能訪問根節點!!!

  代碼如下:

typedef enum{L, R}Tag;   //枚舉定義新的類型
template  //定義一個類,為的是做標志
class stkNode{
public:
    stkNode(BinTreeNode *p = NULL) : ptr(p), tag(L){}
public:                  //數據成員為公有,便于訪問
    BinTreeNode *ptr;  
    Tag                   tag; //L R
};
template
void BinTree::endOrder_1(BinTreeNode* t)const{
    stkNode n;
    stack> st;  //此時棧中存放的是對象!
    BinTreeNode *p = t;
    
    do{
        while(p != NULL){  //不為空,一路向左入棧
            n.ptr = p;    //將指針給過去
            n.tar = L;    //記為左邊入棧
            st.push(n);
            p = p->leftChild;
        }
        bool isRun = true;  //是否繼續的標志
        while(isRun && !st.empty()){  
            n = st.top();  //讀棧頂
            st.pop();     //出棧

            switch(n.tag){  //根據L和R選擇
            case L:
                p = n.ptr; 
                n.tag = R;  //更改為R
                st.push(n);  //壓入棧
                p = p->rightChild;  //看有沒有右孩子,有的話,結束循環,要入棧的;
                isRun = false;  //特別重要,保證了右孩子的入棧!
                break;
            case R:
                cout<data<<" ";
                break;
            }
        }
    }while(!st.empty());//不用p1=NULL,因為當棧空時,最后一個節點剛好被訪問完成。
}

畫圖跟蹤后序如下:

二叉樹之非遞歸遍歷  

  (2)、廣度優先用隊列

  層次遍歷:根結點入隊列,隊列非空,出隊訪問,在將左右孩子入隊,非空,訪問,構成循環;

  代碼如下:

template
void BinTree::levelOrder(BinTreeNode* t)const{
    queue *> qu;  //隊列里面放的是指向節點的指針
    BinTreeNode *p;

    if(t != NULL){ //根非空
        qu.push(t);  //根入隊
        while(!qu.empty()){  //隊列非空
            p = qu.front();  //讀隊首
            qu.pop();        //出隊
            cout<data<<" "; //訪問
            if(p->leftChild){  //左孩子存在
                qu.push(p->leftChild); //入隊
            }
            if(p->rightChild){   //右孩子存在
                qu.push(p->rightChild);  //入隊
            }
        }
    }
}


網站欄目:二叉樹之非遞歸遍歷
標題來源:http://www.xueling.net.cn/article/jjhjeo.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲国产成人精品无码区99 | 羞辱尤娜3中文版 | 日韩一区二区三区无码人妻视频 | 亚洲成人看片 | 伊人wwwyiren22| 亚洲欧洲日韩一区 | 日韩人妻无码精品系列专区 | 国产a一级无码毛片一区二区三区 | 亚洲精品欧美精品日韩精品 | 国产婷婷色一区二区三区四区 | 99久久中文字幕三级久久日本 | 免费精品国产福利片 | 樱花视频在线观看进击的巨人第三季 | 麻豆传谋在线观看免费 | av中文字幕在线观看第一页 | 热久久久久久久久久 | 97色视 | 国产精品另类激情久久久免费 | 亚洲精品无码久久久久yw | 久久国产免费观看精品 | 色老板美国在线观看 | 国产欧美日本一区二区三区 | 一区免费视频 | 91黄视频在线观看 | 一级特黄在线观看 | 欧美日韩第一页 | 野花香社区在线视频观看播放 | 欧美一级二级三级乱码 | 国产在线小视频 | 一级毛片二级毛片三级毛片 | 香蕉免费网站 | 樱花视频在线观看进击的巨人第三季 | 惊奇队长在线观看 | 琪琪午夜成人理论福利片美容院 | 国产精品亚洲人在线观看 | 亚洲制服丝无码中文在线 | 亚洲精品无码午夜福利理论片 | 日本视频一二三区中文字幕 | 色综合激情无码中文字幕 | 色欲AV永久无码精品无码蜜桃 | 日韩熟妻|