樹的遍歷

二叉樹的遍歷

遍歷即按照一定規(guī)律訪問節(jié)點(diǎn)禁谦,且每個(gè)節(jié)點(diǎn)只訪問一次的過程显设。
線性結(jié)構(gòu)前驅(qū)和后繼的唯一性決定了遍歷路線只有一條,而二叉樹是非線性結(jié)構(gòu)涩盾,每個(gè)節(jié)點(diǎn)可能存在兩個(gè)后繼節(jié)點(diǎn)十气,這導(dǎo)致存在多條遍歷路線。在任意給定的節(jié)點(diǎn)上春霍,判斷不為空后砸西,可以按照某種次序執(zhí)行3個(gè)操作:訪問節(jié)點(diǎn)本身,遍歷該節(jié)點(diǎn)的左子樹址儒,遍歷該節(jié)點(diǎn)的右子樹芹枷。實(shí)際問題一般要求左子樹較右子樹先遍歷,故只采用:1莲趣,左杖狼、根、右 2妖爷,根蝶涩、左、右 3絮识,左绿聘、右、根 次舌,分別稱為:中序遍歷熄攘、先序遍歷和后續(xù)遍歷。

遍歷的遞歸實(shí)現(xiàn)

遞歸實(shí)現(xiàn)比較簡單,已先序遍歷為例彼念。

void preOrder(BinTree *root)     //遞歸先序遍歷 
{
    if(root!=NULL)
    {
        cout<<root->data<<" ";//調(diào)換此三條語句即可
        preOrder(root->lchild);
        preOrder(root->rchild);
    }
}

遍歷的非遞歸實(shí)現(xiàn)

先序遍歷的非遞歸實(shí)現(xiàn)作為例子挪圾,先申請(qǐng)一個(gè)棧存儲(chǔ),

  1. 從根節(jié)點(diǎn)出發(fā)逐沙,沿著左子樹走哲思,訪問一個(gè)節(jié)點(diǎn)后就將這個(gè)節(jié)點(diǎn)放入棧中,代表此節(jié)點(diǎn)訪問過根節(jié)點(diǎn)吩案,但沒有訪問左右子樹棚赔,
  2. 之后沿著左子樹走,上一根節(jié)點(diǎn)的左子樹就開始被訪問了。直到走到左子樹為空指針靠益。
  3. 此時(shí) 遍歷的指針指向空丧肴,判斷棧中是否有節(jié)點(diǎn),若有胧后,則將棧頂元素取出芋浮,將遍歷指針指向此元素的右子樹,棧頂元素的右子樹開始被訪問了壳快,繼續(xù)重復(fù)二步驟纸巷,若棧中無元素則遍歷結(jié)束。
void preOrder(BinTree *root)     //非遞歸先序遍歷 
{
    stack<BinTree*> s;
    BinTree *p=root;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            cout<<p->data<<" ";
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty())
        {
            p=s.top();
            s.pop();
            p=p->rchild;
        }
    }
}

中序遍歷的代碼與先序遍歷類似濒憋,不同的是何暇,中序遍歷是先訪問左子樹后才能訪問根節(jié)點(diǎn),所以要在從棧中取出元素時(shí)讀取元素?cái)?shù)據(jù)凛驮。

void inOrder2(BinTree *root)      //非遞歸中序遍歷
{
    stack<BinTree*> s;
    BinTree *p=root;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty())
        {
            p=s.top();
            cout<<p->data<<" ";
            s.pop();
            p=p->rchild;
        }
    }    
}

二叉樹的后序遍歷的非遞歸實(shí)現(xiàn)最為有難度裆站,一般使用遞歸方式即可。

二叉樹的層次遍歷
首先把根節(jié)點(diǎn)入隊(duì)黔夭,之后開始執(zhí)行出隊(duì)操作宏胯,每出隊(duì)一個(gè)節(jié)點(diǎn)就把該節(jié)點(diǎn)的左右孩子加入到隊(duì)列中(即下一層的節(jié)點(diǎn)),隊(duì)頭節(jié)點(diǎn)就是接下來要遍歷的節(jié)點(diǎn)本姥,直到葉子節(jié)點(diǎn)沒有左右子樹進(jìn)而沒有新節(jié)點(diǎn)入隊(duì)肩袍,知道隊(duì)列為空時(shí)遍歷結(jié)束。

#include
#include
using namespace std;
void PrintAtLevel(Tree T) {
    queue myqueue;
    myqueue.push(T);
    while (!myqueue.empty()) {
        Tree tmp = myqueue.front();
        if (tmp->lchild != NULL)
            myqueue.push(tmp->lchild);
        if (tmp->rchild != NULL)
            myqueue.push(tmp->rchild);
        cout << tmp->value << " ";
        myqueue.pop();
    }
}

森林的遍歷

森林的第一棵樹的根相當(dāng)于二叉樹的根婚惫,第一棵樹的子樹組成的森林對(duì)應(yīng)于二叉樹的左子樹氛赐,而除第一棵樹外其余樹組成的森林相當(dāng)于二叉樹的右子樹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末先舷,一起剝皮案震驚了整個(gè)濱河市艰管,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒋川,老刑警劉巖牲芋,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捺球,居然都是意外死亡缸浦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門氮兵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裂逐,“玉大人,你說我怎么就攤上這事胆剧⌒跄罚” “怎么了醉冤?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵秩霍,是天一觀的道長篙悯。 經(jīng)常有香客問我,道長铃绒,這世上最難降的妖魔是什么鸽照? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮颠悬,結(jié)果婚禮上矮燎,老公的妹妹穿的比我還像新娘皂股。我一直安慰自己舞虱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布府蔗。 她就那樣靜靜地躺著灾票,像睡著了一般峡谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刊苍,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天既们,我揣著相機(jī)與錄音,去河邊找鬼正什。 笑死啥纸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婴氮。 我是一名探鬼主播斯棒,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼主经!你這毒婦竟也來了荣暮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤旨怠,失蹤者是張志新(化名)和其女友劉穎渠驼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鉴腻,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迷扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爽哎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜓席。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖课锌,靈堂內(nèi)的尸體忽然破棺而出厨内,到底是詐尸還是另有隱情祈秕,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布雏胃,位于F島的核電站请毛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞭亮。R本人自食惡果不足惜方仿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望统翩。 院中可真熱鬧仙蚜,春花似錦、人聲如沸厂汗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娶桦。三九已至贾节,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趟紊,已是汗流浹背氮双。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霎匈,地道東北人戴差。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像铛嘱,于是被迫代替她去往敵國和親暖释。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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