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