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

根節(jié)點(diǎn).png

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

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

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

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

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

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

    可以看到當(dāng)前是遞歸四,棧中保存了四個(gè)遞歸
    點(diǎn)擊遞歸三,你會(huì)看他遞歸三當(dāng)前執(zhí)行的語句是淡藍(lán)色的 theFirstTraversal(root.getRightNode);也是是當(dāng)前遞歸出棧會(huì)從這里開始向下執(zhí)行.
    這就是遞歸的機(jī)制,
    用樹的遍歷來理解多重嵌套的遞歸,
    同樣,在設(shè)計(jì)分治算法的時(shí)候,用樹了構(gòu)造自己的算法是不是容易些呢? 這也是我準(zhǔn)備做的事情.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容