數(shù)據(jù)結構_知識點_二叉樹遍歷

常見遍歷方式有四種,先序须喂、中序吁断、后序趁蕊、層次遍歷。

1. 先中后序遍歷(遞歸)

void preOrder(tree t)
{
    if(t != NULL)
    {
        visit(t);
        preOrder(t->lchild);
        preOrder(t->rchild);
    }
}

先中后仔役,不過是調(diào)整了visit的順序而已掷伙。

2. 先中序遍歷(非遞歸)

void InOrder2(tree t)
{
    InitStack(s);
    tree p = t;
    
    while(!p || !IsEmpty(s))
    {
        if(p)
        {
            push(s,p);
            p = p->lchild;
        }
        else
        {
            pop(s,p);
            visit(p);
            p = p->rchlid;
        }
    }
}

無論前序還是中序,結點指針的順序都是

  1. 指向根結點又兵,入棧
  2. 不斷指向左孩子任柜,入棧(此時訪問結點,前序)
  3. 直到為空
  4. 指向通過出棧結點沛厨,指向雙親(此時訪問結點宙地,中序)
  5. 指向右孩子

不斷重復上述過程,
直到指向二叉樹右子樹最下層的最右的結點逆皮,此時由于不用指向雙親宅粥,因此臨時保存雙親結點的棧已經(jīng)為空。
再指向這個結點的右孩子(棧依舊為空)电谣,其右孩子也為空秽梅,因此滿足退出循環(huán)。


從微觀角度來看
指針指向一個結點
如果要訪問其左孩子(左孩子不為空時就要訪問)辰企,則要保存該結點(入棧)
以備指針指向該結點(出棧)风纠,以訪問其右孩子

每一個分支,都要先指向雙親結點牢贸,
然后指向它的左孩子(也許要遍歷左子樹)竹观,
然后回頭指向雙親結點,
接著指向它的右孩子(也許要遍歷右子樹)


前序潜索,中序的區(qū)別在于
前序是第一次指向結點時臭增,訪問結點
中序是指針指向結點的左孩子,通過出棧竹习,指針重新指向結點時誊抛,訪問結點

3. 后序非遞歸

后序遍歷方式依舊使用棧,分析可得遍歷流程為:

I. 指針指向根結點整陌,找到其左孩子
II. 指針指向其左孩子拗窃,訪問左子樹
III. 指針指向其右孩子,訪問右子樹 
IV. 指針指向結點泌辫,訪問
V. 指針指向其雙親結點

入棧規(guī)則:結點入棧随夸,左子樹入棧,所有左子樹出棧后震放,結點右子樹進棧宾毒。
出棧規(guī)則:結點為葉子節(jié)點,立即出棧殿遂;結點的左右孩子均被訪問過诈铛。

一個子樹的根結點在這個過程中總共被指針指向過三次乙各,第一次通過其訪問其左孩子,第二次通過其訪問其右孩子幢竹,最后一次訪問該結點耳峦。

如何判斷是第幾次指向結點以確定該如何操作是問題關鍵。
方法有兩種:
(1) 保留指向上一次出棧結點的指針
若其等于棧頂結點的左孩子妨退,則表明左子樹遍歷完成妇萄,開始遍歷右子樹
若其等于棧頂結點的右孩子,則表明現(xiàn)結點的左右子樹都遍歷完畢咬荷,可以出棧
如果都不是冠句,指針指向棧頂左孩子,并入棧

(2) 創(chuàng)建一個tag棧幸乒,記錄s棧中結點被訪問的次數(shù)懦底,每次只處理棧頂結點。
根結點入棧罕扎,tag為0聚唐,則開始遍歷左子樹,且tag++
tag為1腔召,則開始遍歷右子樹杆查,且tag++
tag為2,則代表已經(jīng)遍歷完左右子樹臀蛛,將結點亲桦,以及tag出棧

void traverse(tree t)
{
    initStack(s);
    initStack(tag);
    
    tree p = t;
    push(p,s);
    push(0,tag);

    while(!IsEmpty(s))
    {
        switch(tag[top])
        {
            case 0:
                {
                    tag[top]++;
                    p = getTop(s)->lchild;

                    if(p)
                    {
                        push(p,s);
                        push(0,tag);
                    }    
                }
            case 1:
                {
                    tag[top]++;
                    p = getTop(s)->rchild;

                    if(p)
                    {
                        push(p,s);
                        push(0,tag);
                    }    
                    
                }
            case 2:
                {
                    visit(s[top]);
                    pop(s);
                    pop(tag);
                }
        }

    }
}

(3) 雙棧法

  1. 根結點進入s1
  2. 根結點出棧,進入s2
  3. 根結點的左結點進入s1浊仆,右結點進入s1
  4. 右結點出棧客峭,進入s2
  5. 左結點出棧,進入s2
    因此抡柿,進入s2的順序是舔琅,根結點,右結點洲劣,左結點
    出棧的順序备蚓,左結點,右結點囱稽,根結點
void PostTraverse(BiTree T){  
    BiTree root = T ;  
    SqStack S1,S2; //輔助棧星著,S1用來存儲樹入棧,S2用來存儲后序遍歷序列  
      
    //初始化  
    InitStack(S1);   
    InitStack(S2) ;  
  
    Push(S1,root);  //1.首先根節(jié)點入棧  
  
    while(!isEmpty(S1)){ //當棧S1不為空時:1.先S1出棧 2.將從S1出棧的棧頂元素入棧S2  
          
            BiTree P=Pop(S1);  
            Push(S2,P);  
            if(P->lchild !=NULL) Push(S1,P->lchild);  
            if(P->rchild !=NULL) Push(S1,P->rchild) ;  
    }  
    while(!isEmpty(S2)){  
        printf("%c",(*(--S2.top))->data);  
    }  
}  
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粗悯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子同欠,更是在濱河造成了極大的恐慌样傍,老刑警劉巖横缔,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衫哥,居然都是意外死亡茎刚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門撤逢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膛锭,“玉大人,你說我怎么就攤上這事蚊荣〕跽” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵互例,是天一觀的道長奢入。 經(jīng)常有香客問我,道長媳叨,這世上最難降的妖魔是什么腥光? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮糊秆,結果婚禮上武福,老公的妹妹穿的比我還像新娘。我一直安慰自己痘番,他們只是感情好捉片,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夫偶,像睡著了一般界睁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兵拢,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天翻斟,我揣著相機與錄音,去河邊找鬼说铃。 笑死访惜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的腻扇。 我是一名探鬼主播债热,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幼苛!你這毒婦竟也來了窒篱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墙杯,沒想到半個月后配并,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡高镐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年溉旋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫉髓。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡观腊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出算行,到底是詐尸還是另有隱情梧油,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布纱意,位于F島的核電站婶溯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏偷霉。R本人自食惡果不足惜迄委,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望类少。 院中可真熱鬧叙身,春花似錦、人聲如沸硫狞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽残吩。三九已至财忽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泣侮,已是汗流浹背即彪。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留活尊,地道東北人隶校。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蛹锰,于是被迫代替她去往敵國和親深胳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容