多重嵌套遞歸絕佳的理解方式

根節(jié)點.png

在學(xué)習(xí)分治算法的時候,分治算法經(jīng)常要用到的就是遞歸了,但是嵌套遞歸讓我感覺很迷茫,在學(xué)習(xí)樹的遍歷的時候,就花了很長時間看明白樹的遍歷方式.
并且自己用棧實現(xiàn)了樹的非遞歸方式,如果讀者也對嵌套遞歸表示茫然的話,非常建議先去看一下上面的知識.
這里我要講的雖然是理解多重嵌套, 更重要的是理解分治算法,設(shè)計合適的遞歸方法來解決此類問題.
回到正題,樹的遍歷可以說是非常好的分治算法的例子了.
一顆樹,有左子樹和右子樹,
左子樹有 左子樹和右子樹
右子樹有 左子樹和右子樹
左子樹的左子樹有 左子樹和右子樹..
......

我們來看一下遞歸遍歷樹的語句

void preorderTraverse(Tree tree){  
    if(tree==null)return;   //這是遞歸終止條件  ,遞歸終止意味返回上一級遞歸, 語句1
    visit(tree); //語句2
    preorderTraverse(tree.leftchild);//遞歸遍歷左子樹  語句3
    preorderTraverse(tree.rightchild);//語句4
}

先來分析一下樹的前序遍歷

設(shè)當(dāng)前為(遞歸一)

  • 根節(jié)點進(jìn)入
  • 語句1: 根不為空 //設(shè)當(dāng)前程序為遞歸1
  • 語句2:訪問根節(jié)點 [根]
  • 語句3: 遞歸2:遍歷當(dāng)前樹的左子樹 ,即A
    (遞歸一(遞歸二))
  • A節(jié)點進(jìn)入
  • 語句1: A不為空
  • 語句2:訪問A [根 A]
  • 語句3: 遞歸3:遍歷當(dāng)前樹的左子樹 ,即B
    (遞歸一(遞歸二(遞歸三)))
  • B節(jié)點進(jìn)入
  • 語句1: B不為空
  • 語句2:訪問B節(jié)點[根 A B]
  • 語句3: 遞歸4:遍歷當(dāng)前樹的左子樹 ,即D
    (遞歸一(遞歸二(遞歸三(遞歸四))))
  • D節(jié)點進(jìn)入
  • 語句1: D不為空
  • 語句2:訪問D節(jié)點 [根 A B D]
  • 語句3: 遞歸5:遍歷當(dāng)前樹的左子樹 ,即E
    (遞歸一(遞歸二(遞歸三(遞歸四(遞歸五)))))
  • E節(jié)點進(jìn)入
  • 語句1: E不為空
  • 語句2:訪問E節(jié)點 [根 A B D E]
  • 語句3: 遞歸6:遍歷當(dāng)前樹的左子樹 ,為NULL
    (遞歸一(遞歸二(遞歸三(遞歸四(遞歸五(遞歸六)))))
  • NULL節(jié)點進(jìn)入
  • 語句1:NULL==NULL 返回 遞歸6結(jié)束 注意遞歸向上返回一級,,順序執(zhí)行下一句,
    (遞歸一(遞歸二(遞歸三(遞歸四(遞歸五))))
  • 此時返回到遞歸5,語句三結(jié)束, 此時執(zhí)行的是遞歸五的最后一個語句
  • 執(zhí)行語句4,現(xiàn)在系統(tǒng)已經(jīng)把五的信息加載進(jìn)來了, 此時當(dāng)前樹是E 遞歸6 遍歷當(dāng)前
    樹的右子樹 NULL
    (遞歸一(遞歸二(遞歸三(遞歸四(遞歸五{-遞歸六-})))))
  • NULL節(jié)點進(jìn)入,返回 向上返回一級
  • 遞歸6結(jié)束
    (遞歸一(遞歸二(遞歸三(遞歸四(遞歸五)))))
  • 由于遞歸五執(zhí)行完畢,所以退出到 遞歸四
    (遞歸一(遞歸二(遞歸三(遞歸四))))
  • 當(dāng)前節(jié)點是D,語句3結(jié)束
  • 語句4 :'遞歸5' 遞歸遍歷當(dāng)前節(jié)點右子樹 F 注意此時又是執(zhí)行了當(dāng)前遞歸四的最后一句
    (遞歸一(遞歸二(遞歸三(遞歸四 {-遞歸五-} ))))
  • 語句1: F不為空
  • 語句2:訪問F節(jié)點 [根 A B D E F ]
  • 語句3: 遞歸6:遍歷當(dāng)前樹的左子樹 ,為NULL
    (遞歸一(遞歸二(遞歸三(遞歸四{- 遞歸五(遞歸六) -} ))))
  • NULL節(jié)點進(jìn)入
  • 語句1:NULL==NULL 返回 遞歸6結(jié)束 注意遞歸向上返回一級
    (遞歸一(遞歸二(遞歸三(遞歸四(遞歸五)))))
    語句四 '遞歸六' 訪問當(dāng)前節(jié)點右子樹NULL注意此時執(zhí)行開始執(zhí)行了遞歸五的最后一句
    (遞歸一(遞歸二(遞歸三(遞歸四{-遞歸五{-遞歸六-} -}))))
  • NULL=NULL 返回 遞歸六結(jié)束,同理 遞歸五最后一句執(zhí)行完畢,遞歸四的最后一句執(zhí)行完畢 ,直接推到遞歸三
    (遞歸一(遞歸二(遞歸三)))
    剩下的讀者自己琢磨吧
    我用{- -}區(qū)分了第二個遞歸,可以看到執(zhí)行 {- -} 遞歸后,出來直接跳到最外邊,因為{- -}內(nèi)的遞歸是最后一句
    image.png

    可以看到當(dāng)前是遞歸四,棧中保存了四個遞歸
    點擊遞歸三,你會看他遞歸三當(dāng)前執(zhí)行的語句是淡藍(lán)色的 theFirstTraversal(root.getRightNode);也是是當(dāng)前遞歸出棧會從這里開始向下執(zhí)行.
    這就是遞歸的機(jī)制,
    用樹的遍歷來理解多重嵌套的遞歸,
    同樣,在設(shè)計分治算法的時候,用樹了構(gòu)造自己的算法是不是容易些呢? 這也是我準(zhǔn)備做的事情.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疆瑰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌企孩,老刑警劉巖剃盾,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斤富,死亡現(xiàn)場離奇詭異旺芽,居然都是意外死亡柠傍,警方通過查閱死者的電腦和手機(jī)馋嗜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門齐板,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葛菇,你說我怎么就攤上這事甘磨。” “怎么了眯停?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵济舆,是天一觀的道長。 經(jīng)常有香客問我莺债,道長滋觉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任齐邦,我火速辦了婚禮椎侠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侄旬。我一直安慰自己肺蔚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布儡羔。 她就那樣靜靜地躺著宣羊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汰蜘。 梳的紋絲不亂的頭發(fā)上仇冯,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音族操,去河邊找鬼苛坚。 笑死,一個胖子當(dāng)著我的面吹牛色难,可吹牛的內(nèi)容都是我干的泼舱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枷莉,長吁一口氣:“原來是場噩夢啊……” “哼娇昙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笤妙,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冒掌,失蹤者是張志新(化名)和其女友劉穎噪裕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體股毫,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膳音,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铃诬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祭陷。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氧急,靈堂內(nèi)的尸體忽然破棺而出颗胡,到底是詐尸還是另有隱情,我是刑警寧澤吩坝,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布毒姨,位于F島的核電站,受9級特大地震影響钉寝,放射性物質(zhì)發(fā)生泄漏弧呐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一嵌纲、第九天 我趴在偏房一處隱蔽的房頂上張望俘枫。 院中可真熱鬧,春花似錦逮走、人聲如沸鸠蚪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茅信。三九已至,卻和暖如春墓臭,著一層夾襖步出監(jiān)牢的瞬間蘸鲸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工窿锉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留酌摇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓嗡载,卻偏偏與公主長得像窑多,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洼滚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)埂息,樹與前面介紹的線性表,棧,隊列等線性結(jié)構(gòu)不同耿芹,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,455評論 1 31
  • 數(shù)據(jù)結(jié)構(gòu)和算法--二叉樹的實現(xiàn) 幾種二叉樹 1、二叉樹 和普通的樹相比挪哄,二叉樹有如下特點: 每個結(jié)點最多只有兩棵子...
    sunhaiyu閱讀 6,467評論 0 14
  • 一.公司或項目簡介 隨著農(nóng)村生活水平的提高吧秕,越來越多的農(nóng)村居民對子女的教育投入有了大幅度的提高。但是由于城鄉(xiāng)教育水...
    上官青兒閱讀 1,557評論 0 2
  • 你已經(jīng)離開很久很久迹炼,而我還在這里殷切守候砸彬。――題記六月,正值夏季最熱的時候斯入,田里的麥子長的老高砂碉,陽光下閃閃發(fā)光,是...
    川葉子夕閱讀 819評論 14 11
  • 上周四滋迈,有幸采訪了@古爾浪洼老師,請教了“寫作”和“職場”這兩方面的困惑户誓。今天分享古老師的職場問答饼灿。 古爾浪洼,工...
    弘丹閱讀 2,123評論 14 40