定義
二叉樹中每個結點有一個數據項,最多有兩個子節點,如果允許樹的每個節點可以有兩個以上的子節點,那么這個樹就稱為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叉樹的經典遞歸解法
經典遞歸法
-
"自頂向下"的解決方案
"自頂向下"意味着在每個遞歸層次上,我們首先訪問節點以獲得一些值, 然后在調用遞歸函數時,將這些值傳給其子節點。
一個典型的 “自頂向下” 函數 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]
-
"自底向上"的解決方案
"自底向上" 意味着在每個遞歸層次上,我們首先為每個子節點遞歸地調用函數, 然后根據返回值和根節點本身的值給出相應結果。
一個典型的 “自底向上” 函數 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叉樹的最大深度