簡體   English   中英

用二進制樹中的遞歸計數讓我感到困惑

[英]Counting with recursion in binary trees confuse me

我正在嘗試盡可能多地學習關於樹及其算法的知識。 當我想對二叉樹中的內容進行計數時,似乎無法真正了解遞歸的工作原理。 例如,如果我想計算節點或葉子或其他東西。 當我查看解決方案時,我不知道計數器如何增加等等。我可以記住該特定問題的解決方案,但是當我遇到另一個包括計數在內的問題時,我不知道如何啟動我的功能。

您對我的問題有什么建議嗎? 您如何通過遞歸學習不同的計數算法。 我完全理解每種迭代解決方案,並且知道如何使用。

預先感謝您的回復

為了對二叉樹中的事物進行計數,其遞歸定義非常方便:

一棵樹由三個元素組成:節點N是樹的根,子樹L是樹本身,子樹R也是樹。

使用此定義,例如,我們可以按以下方式計算樹的葉子:
一棵樹的葉子數是

  • 如果樹為空( Nnull ),則為0
  • 如果LR都為空,則為1
  • 否則LR的葉子數

基本思想是,我們可以使用休假沒有子代( LR都是空的)和空樹沒有葉子的事實作為基本情況。 從這一點出發,我們可以簡單地說一棵樹具有上述屬性之一,因此根本身就是葉子,或者樹中沒有節點,或者葉子分布在LR ,我們只需要計算和總結兩個子樹中的葉子數。

或作為偽代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM