[英]Counting with recursion in binary trees confuse me
我正在嘗試盡可能多地學習關於樹及其算法的知識。 當我想對二叉樹中的內容進行計數時,似乎無法真正了解遞歸的工作原理。 例如,如果我想計算節點或葉子或其他東西。 當我查看解決方案時,我不知道計數器如何增加等等。我可以記住該特定問題的解決方案,但是當我遇到另一個包括計數在內的問題時,我不知道如何啟動我的功能。
您對我的問題有什么建議嗎? 您如何通過遞歸學習不同的計數算法。 我完全理解每種迭代解決方案,並且知道如何使用。
預先感謝您的回復
為了對二叉樹中的事物進行計數,其遞歸定義非常方便:
一棵樹由三個元素組成:節點
N
是樹的根,子樹L
是樹本身,子樹R
也是樹。
使用此定義,例如,我們可以按以下方式計算樹的葉子:
一棵樹的葉子數是
N
為null
),則為0 L
和R
都為空,則為1 L
和R
的葉子數 基本思想是,我們可以使用休假沒有子代( L
和R
都是空的)和空樹沒有葉子的事實作為基本情況。 從這一點出發,我們可以簡單地說一棵樹具有上述屬性之一,因此根本身就是葉子,或者樹中沒有節點,或者葉子分布在L
和R
,我們只需要計算和總結兩個子樹中的葉子數。
或作為偽代碼:
countLeaves(node N):
//the tree is empty
if N == null:
return 0
//N is a leave
if L == null && R == null:
return 1
//count leaves in both subtrees
return countLeaves(L) + countLeaves(R)
許多人在使用遞歸(或通常使用遞歸解決方案)計算樹木時面臨困難。 因此,我將在不舉任何具體例子的情況下給出建議。
樹和遞歸的問題是-控制流不是像迭代解決方案那樣簡單。 在樹中,您必須訪問所有分支,尤其是所有節點,並根據問題的需求進行計數。 無論使用哪種遍歷,都需要首先弄清楚要計數的任何節點的條件是什么,例如,如果您正在尋找葉子,那么什么條件定義了任何節點-葉子。 一旦弄清楚了,您就會在遞歸中獲得基本條件的確認,然后您就可以繼續訪問每個節點,在滿足特定條件時增加計數器,並在滿足返回/終止條件時終止或從遞歸調用中返回。
您需要稍微訓練一下才能可視化遞歸結構,為此,只需手動運行遞歸函數即可解決您所閱讀或記住的問題。 使用您創建的示例可以解決一些問題。 希望能幫助到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.