二叉樹遍歷遞歸 層序遍歷二叉樹與經(jīng)典遞歸遍歷的性能差距多大?
層序遍歷二叉樹與經(jīng)典遞歸遍歷的性能差距多大?遞歸遍歷二叉樹程序很短,易懂。在性能方面,遞歸速度快,占用內(nèi)存少。但遞歸程序包含深度優(yōu)先和廣度優(yōu)先的遍歷方法,比較復(fù)雜,容易出錯(cuò)?,F(xiàn)在CPU速度非常快,堆棧
層序遍歷二叉樹與經(jīng)典遞歸遍歷的性能差距多大?
遞歸遍歷二叉樹程序很短,易懂。在性能方面,遞歸速度快,占用內(nèi)存少。但遞歸程序包含深度優(yōu)先和廣度優(yōu)先的遍歷方法,比較復(fù)雜,容易出錯(cuò)。
現(xiàn)在CPU速度非常快,堆??臻g非常大。性能差異可以忽略不計(jì)。
或遞歸遍歷二叉樹程序可讀性更好。
二叉樹的遍歷算法實(shí)現(xiàn)為何要采用遞歸?
數(shù)據(jù)結(jié)構(gòu)中二叉樹的定義是遞歸的,自然易懂。
二叉樹的層次遍歷不是遞歸的,而是使用隊(duì)列。數(shù)據(jù)結(jié)構(gòu)中二叉樹的定義如下(不同于圖論中樹的定義):1。這是一個(gè)空集。2它由根節(jié)點(diǎn)及其左右子樹組成,左右子樹滿足二叉樹的定義。
編寫一個(gè)程序,實(shí)現(xiàn)二叉樹的先序遍歷,中序遍歷,后序遍歷的各種遞歸和非遞歸算法,以及層次遍歷的算法?
二叉樹可以通過(guò)后序和中序遍歷進(jìn)行恢復(fù),以方便其他樹的操作。在這里,我們先恢復(fù)二叉樹,然后進(jìn)行預(yù)序遍歷,得到預(yù)序遍歷的結(jié)果。我們同意恢復(fù)樹的函數(shù)稱為restoretree()。恢復(fù)左右子樹時(shí),需要計(jì)算它們的位置,即H1、H2和Z1、Z2的值需要重新計(jì)算,并在更新后傳遞給restoretree()函數(shù)。以左子樹的構(gòu)造為例,左子樹的第一個(gè)元素下標(biāo)為Z1,最后一個(gè)元素下標(biāo)為I-1,H1的對(duì)應(yīng)值為H1,H2的值為H1(I-Z1-1),即H1的當(dāng)前位置向前移動(dòng)I-Z1-1長(zhǎng)度。R代碼實(shí)現(xiàn)以實(shí)現(xiàn)前面提到的字母序列為例,因?yàn)楫?dāng)代碼恢復(fù)樹時(shí),它首先恢復(fù)根節(jié)點(diǎn),然后訪問(wèn)樹的左、右子樹,所以恢復(fù)過(guò)程也相當(dāng)于根優(yōu)先遍歷過(guò)程。如果只想先遍歷找到根,就不能構(gòu)建樹。我們可以刪除根優(yōu)先遍歷函數(shù)并簡(jiǎn)化其他一些語(yǔ)句,這兩段代碼的結(jié)果是相同的。以下是示例輸入和輸出。這里的代碼擴(kuò)展添加了一段代碼,它使用前序遍歷和中序遍歷來(lái)恢復(fù)二叉樹并進(jìn)行后序遍歷。R代碼可以像以前一樣簡(jiǎn)化。簡(jiǎn)化后,無(wú)需建樹即可遍歷。區(qū)別與聯(lián)系:遞歸是迭代的特例。理論上,任何遞歸都可以轉(zhuǎn)化為迭代。優(yōu)缺點(diǎn)及比較:遞歸性能不如迭代,但遞歸思想簡(jiǎn)單明了,有時(shí)必須用遞歸來(lái)做,但迭代做不到。例如,在實(shí)際開發(fā)中,有一個(gè)描述實(shí)體之間層次關(guān)系的表,比如遍歷所有實(shí)體之間的層次關(guān)系,即N:m的關(guān)系,它事先不知道每個(gè)實(shí)體的個(gè)數(shù),所以不能通過(guò)迭代來(lái)實(shí)現(xiàn)。我們必須用遞歸來(lái)做深層遞歸才能得到結(jié)果。
深究遞歸和迭代的區(qū)別,聯(lián)系,優(yōu)缺點(diǎn)及實(shí)例對(duì)比?
二叉樹的層次遍歷是指從二叉樹的第一層(根節(jié)點(diǎn))開始,從上到下逐層遍歷。在同一層中,從左到右依次訪問(wèn)節(jié)點(diǎn)。在逐層遍歷的過(guò)程中,從上到下,從左到右在同一層中訪問(wèn)樹中的元素。其思想是:用一個(gè)隊(duì)列來(lái)保存當(dāng)前節(jié)點(diǎn)的左右子節(jié)點(diǎn),實(shí)現(xiàn)序列遍歷。在層次遍歷中,設(shè)置了一個(gè)隊(duì)列結(jié)構(gòu)。遍歷從二叉樹的根節(jié)點(diǎn)開始。首先,將根節(jié)點(diǎn)指向隊(duì)列,然后從隊(duì)列的頭部獲取元素。對(duì)于每個(gè)元素,將執(zhí)行以下兩個(gè)操作:1。訪問(wèn)元素所指向的節(jié)點(diǎn)。2如果元素指示的節(jié)點(diǎn)的左、右子節(jié)點(diǎn)不為空,則元素指示的節(jié)點(diǎn)的左子指針和右子指針將按順序排隊(duì)。當(dāng)隊(duì)列為空時(shí),二叉樹的層次遍歷結(jié)束。由于遍歷所使用的數(shù)據(jù)結(jié)構(gòu)是一個(gè)隊(duì)列而不是一個(gè)堆棧,因此很難編寫分層遍歷的遞歸程序。下面的程序是用來(lái)逐層遍歷二叉樹的,它使用的是隊(duì)列數(shù)據(jù)結(jié)構(gòu)。隊(duì)列中的元素指向二叉樹節(jié)點(diǎn)。當(dāng)然,您也可以使用公式化隊(duì)列。在程序中,只有當(dāng)樹不為空時(shí),它才進(jìn)入wehile循環(huán)。首先訪問(wèn)根節(jié)點(diǎn),然后將其子節(jié)點(diǎn)添加到隊(duì)列中。當(dāng)queue add操作失敗時(shí),add將引發(fā)nomem異常。因?yàn)闆](méi)有捕獲異常,所以當(dāng)異常發(fā)生時(shí),函數(shù)將退出。將T的子元素添加到隊(duì)列后,T元素將從隊(duì)列中刪除。