最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

二叉樹的遍歷算法(詳細(xì)示例分析)

 更新時(shí)間:2013年05月07日 11:10:30   作者:  
以下代碼是對(duì)二叉樹的遍歷算法進(jìn)行了分析介紹,需要的朋友可以參考下

復(fù)制代碼 代碼如下:

#include<iostream>
#include<assert.h>
#include<stack>
#include<queue>
using namespace std;
struct Node
{
    int v;
    Node *leftChild,*rightChild;
    Node():leftChild(NULL),rightChild(NULL){}
    Node(int vv):leftChild(NULL),rightChild(NULL)
    {
        v=vv;
    }
};

void print(int v)
{
    cout<<v<<"   ";
}
void PreOrderTraverse(Node *n, void (* visit)(int))
{
    assert(n!=NULL&&visit!=NULL);
    (*visit)(n->v);
    if(n->leftChild!=NULL) PreOrderTraverse(n->leftChild,visit);
    if(n->rightChild!=NULL) PreOrderTraverse(n->rightChild,visit);
}

void InOrderTraverse(Node *n, void (* visit)(int))
{
    assert(n!=NULL&&visit!=NULL);
    if(n->leftChild!=NULL) InOrderTraverse(n->leftChild,visit);
    (*visit)(n->v);
    if(n->rightChild!=NULL) InOrderTraverse(n->rightChild,visit);
}

void PostOrderTraverse(Node *n, void (* visit)(int))
{
    assert(n!=NULL&&visit!=NULL);
    if(n->leftChild!=NULL) PostOrderTraverse(n->leftChild,visit);
    if(n->rightChild!=NULL) PostOrderTraverse(n->rightChild,visit);
    (*visit)(n->v);
}
//非遞歸版本,將遞歸改成非遞歸一般都要利用一個(gè)棧
//每次訪問一個(gè)結(jié)點(diǎn)后,在向左子樹遍歷下去之前,利用這個(gè)棧記錄該結(jié)點(diǎn)的右子女(如果有的話)結(jié)點(diǎn)的地址,
//以便在左子樹退回時(shí)可以直接從棧頂取得右子樹的根結(jié)點(diǎn),繼續(xù)右子樹的遍歷
void PreOrder(Node *n, void (* visit)(int))
{
    stack<Node*> sta;
    sta.push(n);
    while(!sta.empty())
    {
        Node * t=sta.top();
        sta.pop();
        assert(t!=NULL);
        (*visit)(t->v);
        if(t->rightChild!=NULL) sta.push(t->rightChild);
        if(t->leftChild!=NULL) sta.push(t->leftChild);
    }
}

//非遞歸中序遍歷
void InOrder(Node * n , void (* visit) (int))
{
    stack<Node *> sta;
    sta.push(n);
    Node * p= n;
    while(!sta.empty()&&p!=NULL)
    {
        p=sta.top();
        while(p!=NULL&&!sta.empty())
        {
            sta.push(p->leftChild);
            p=p->leftChild;
        }
        sta.pop();//彈出空指針
        if(!sta.empty())
        {
            p=sta.top();
            sta.pop();
            (*visit)(p->v);
            sta.push(p->rightChild);
        }
    }
}


//非遞歸后續(xù)遍歷

struct StkNode
{
    Node * ptr;
    bool tag;//false=left and true=right
    StkNode():ptr(NULL),tag(false)
    {}
};
void PostOrder(Node * n ,void (*visit) (int))
{
    stack<StkNode> sta;
    StkNode w;
    Node * p = n;
    do {
        while(p!=NULL)
        {
            w.ptr=p;
            w.tag=false;
            sta.push(w);
            p=p->leftChild;
        }
        bool flag=true;
        while(flag&&!sta.empty())
        {
            w=sta.top();
            sta.pop();
            p=w.ptr;
            if(!w.tag)//left,如果從左子樹返回,則開始遍歷右子樹
            {
                w.tag=true;//標(biāo)記右子樹
                sta.push(w);
                flag=false;
                p=p->rightChild;
            }
            else
            {
                (*visit)(p->v);
            }
        }
    } while(!sta.empty());
}

//層序遍歷,利用隊(duì)列
void LevelOrderTraverse(Node * n , void (* visit )(int))
{
    assert(n!=NULL&&visit!=NULL);
    queue<Node * > que;
    que.push(n);
    while(!que.empty())
    {
        Node * t=que.front();
        (*visit)(t->v);
        que.pop();
        if(t->leftChild!=NULL) que.push(t->leftChild);
        if(t->rightChild!=NULL) que.push(t->rightChild);
    }
}

int main()
{
    Node * head= new Node(0);
    Node * node1= new Node(1);
    Node * node2= new Node(2);
    Node * node3= new Node(3);
    Node * node4= new Node(4);
    Node * node5= new Node(5);
    Node * node6= new Node(6);


    head->leftChild=node1;
    head->rightChild=node2;   
    node1->leftChild=node3;
    node1->rightChild=node4;
    node2->rightChild=node5;
    node4->leftChild=node6;

   
/*    LevelOrderTraverse(head,print);
    cout<<endl;
    PreOrderTraverse(head,print);
    cout<<endl;*/
    InOrder(head,print);
    cout<<endl;
    InOrderTraverse(head,print);
    cout<<endl;

    PostOrder(head,print);
    cout<<endl;
    PostOrderTraverse(head,print);
    cout<<endl;
    return 0;
}

相關(guān)文章

  • C#提取網(wǎng)頁(yè)中超鏈接link和text部分的方法

    C#提取網(wǎng)頁(yè)中超鏈接link和text部分的方法

    這篇文章主要介紹了C#提取網(wǎng)頁(yè)中超鏈接link和text部分的方法,涉及C#正則表達(dá)式及字符串操作相關(guān)技巧,需要的朋友可以參考下
    2016-02-02
  • C# 實(shí)現(xiàn)ADSL自動(dòng)斷網(wǎng)和撥號(hào)的方法(適用于撥號(hào)用戶)

    C# 實(shí)現(xiàn)ADSL自動(dòng)斷網(wǎng)和撥號(hào)的方法(適用于撥號(hào)用戶)

    下面小編就為大家?guī)硪黄狢# 實(shí)現(xiàn)ADSL自動(dòng)斷網(wǎng)和撥號(hào)的方法(適用于撥號(hào)用戶)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • Unity實(shí)現(xiàn)移動(dòng)端手勢(shì)解鎖功能

    Unity實(shí)現(xiàn)移動(dòng)端手勢(shì)解鎖功能

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)移動(dòng)端手勢(shì)解鎖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 圖文介紹c#封裝方法

    圖文介紹c#封裝方法

    在本篇內(nèi)容里小編給大家分享的是關(guān)于c#使用封裝方法以及相關(guān)知識(shí)點(diǎn),對(duì)此有需要的朋友們可以學(xué)習(xí)下。
    2018-12-12
  • C#使用Chart繪制曲線

    C#使用Chart繪制曲線

    這篇文章主要為大家詳細(xì)介紹了C#使用Chart繪制曲線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#使用RSA加密解密文件

    C#使用RSA加密解密文件

    這篇文章主要為大家詳細(xì)介紹了C#使用RSA加密解密文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 基于C#解決庫(kù)存扣減及訂單創(chuàng)建時(shí)防止并發(fā)死鎖的問題

    基于C#解決庫(kù)存扣減及訂單創(chuàng)建時(shí)防止并發(fā)死鎖的問題

    這篇文章主要介紹了基于C#解決庫(kù)存扣減及訂單創(chuàng)建時(shí)防止并發(fā)死鎖的問題,很多開發(fā)人員對(duì)于這個(gè)問題的排查起來是比較困難的,而生產(chǎn)生的原因多種多樣,很多人認(rèn)是因?yàn)楸碇械臄?shù)據(jù)太多了同時(shí)操作的人多人才會(huì)產(chǎn)生這種錯(cuò)誤,下面我們來還原一下死鎖的過程
    2022-05-05
  • c# 快速排序算法

    c# 快速排序算法

    快速排序使用分治法(Divide and conquer)策略來把一個(gè)串行(list)分為兩個(gè)子串行(sub-lists)
    2013-10-10
  • C#中static的詳細(xì)用法實(shí)例

    C#中static的詳細(xì)用法實(shí)例

    在C#中所有方法都必須在一個(gè)類的內(nèi)部聲明,然而如果把一個(gè)方法或字段聲明為Static,就可以使用類名來調(diào)用方法或訪問字段,下面這篇文章主要給大家介紹了關(guān)于C#中static詳細(xì)用法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • C#五類運(yùn)算符使用表達(dá)式樹進(jìn)行操作

    C#五類運(yùn)算符使用表達(dá)式樹進(jìn)行操作

    這篇文章介紹了C#五類運(yùn)算符使用表達(dá)式樹進(jìn)行操作,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01

最新評(píng)論

保靖县| 修武县| 新竹市| 乌审旗| 文山县| 乐安县| 金山区| 宁陵县| 宝山区| 伊川县| 乌兰察布市| 西城区| 莲花县| 湖北省| 哈巴河县| 昔阳县| 渑池县| 潢川县| 榆树市| 东城区| 仁怀市| 永顺县| 兰溪市| 黄骅市| 封丘县| 厦门市| 宝丰县| 库车县| 南宫市| 湖州市| 莱芜市| 饶河县| 怀安县| 乌鲁木齐市| 河南省| 车致| 新泰市| 禄丰县| 故城县| 右玉县| 平潭县|