N叉樹基礎(含四種遍歷,圖文詳解)


定義

二叉樹中每個結點有一個數據項,最多有兩個子節點,如果允許樹的每個節點可以有兩個以上的子節點,那么這個樹就稱為n階的多叉樹,或者稱為n叉樹。

性質

每個節點有m個子節點和m-1個鍵值。
每個節點中的鍵值按升序排列。
前i個子節點中的鍵值都小於第i個鍵值。
后m-1個子節點中的鍵值都大於第i個鍵值。

N叉樹的遍歷

樹的遍歷

一棵二叉樹可以按照前序、中序、后序或者層序來進行遍歷。在這些遍歷方法中,前序遍歷、后序遍歷和層序遍歷同樣可以運用到N叉樹中。

回顧 - 二叉樹的遍歷
前序遍歷 - 首先訪問根節點,然后遍歷左子樹,最后遍歷右子樹;
中序遍歷 - 首先遍歷左子樹,然后訪問根節點,最后遍歷右子樹;
后序遍歷 - 首先遍歷左子樹,然后遍歷右子樹,最后訪問根節點;
層序遍歷 - 按照從左到右的順序,逐層遍歷各個節點。

請注意,N叉樹的中序遍歷沒有標准定義,中序遍歷只有在二叉樹中有明確的定義。盡管我們可以通過幾種不同的方法來定義N叉樹的中序遍歷,但是這些描述都不是特別貼切,並且在實踐中也不常用到,所以我們暫且跳過N叉樹中序遍歷的部分。

把上述關於二叉樹遍歷轉換為N叉樹遍歷,我們只需把如下表述:

遍歷左子樹... 遍歷右子樹... 

變為:

對於每個子節點:
      通過遞歸地調用遍歷函數來遍歷以該子節點為根的子樹

我們假設for循環將會按照各個節點在數據結構中的順序進行遍歷:通常按照從左到右的順序,如下所示。

N叉樹遍歷示例

我們用如圖所示的三叉樹來舉例說明:

在這里插入圖片描述

1.前序遍歷

在N叉樹中,前序遍歷指先訪問根節點,然后逐個遍歷以其子節點為根的子樹。
例如,上述三叉樹的前序遍歷是: A->B->C->E->F->D->G.
對應題目解析N叉樹的前序遍歷

2.后序遍歷

在N叉樹中,后序遍歷指前先逐個遍歷以根節點的子節點為根的子樹,最后訪問根節點。
例如,上述三叉樹的后序遍歷是: B->E->F->C->G->D->A.
對應題目解析:N叉樹的后續遍歷。

3.層序遍歷

N叉樹的層序遍歷與二叉樹的一致。通常,當我們在樹中進行廣度優先搜索時,我們將按層序的順序進行遍歷。
例如,上述三叉樹的層序遍歷是: A->B->C->D->E->F->G.
對應題目解析:https://blog.csdn.net/weixin_43314519/article/details/106981653

N叉樹的經典遞歸解法

經典遞歸法

  1. "自頂向下"的解決方案

     "自頂向下"意味着在每個遞歸層次上,我們首先訪問節點以獲得一些值,
     然后在調用遞歸函數時,將這些值傳給其子節點。
    

一個典型的 “自頂向下” 函數 top_down(root, params) 的工作原理如下:

1. 對於 null 節點返回一個特定值
2. 如果有需要,對當前答案 answer 進行更新                         // answer <-- params
3. for each child node root.children[k]:
4.    ans[k] = top_down(root.children[k], new_params[k])  // new_params <-- root.val, params
5. 如果有需要,返回答案 answer                                 // answer <-- all ans[k]
  1. "自底向上"的解決方案

     "自底向上" 意味着在每個遞歸層次上,我們首先為每個子節點遞歸地調用函數,
     然后根據返回值和根節點本身的值給出相應結果。
    

一個典型的 “自底向上” 函數 bottom_up(root)的工作原理如下:

1.對於 null 節點返回一個特定值
2.for each child node root.children[k]:
3.    ans[k] = bottom_up(root.children[k]) // 為每個子節點遞歸地調用函數
4. 返回答案 answer                          // answer <- root.val, all ans

對應題目解析: N叉樹的最大深度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM