在之前的章節中,我們已經介紹了如何解決樹的遍歷問題。我們也已經嘗試過使用遞迴解決樹的為前序遍歷、中序遍歷和後序遍歷問題。
事實上,遞迴是解決樹相關問題的最有效和最常用的方法之一。本節中,我們將會介紹兩種典型的遞迴方法。
本小節內容節選自 leetcode:運用遞迴解決樹的問題 .遞迴是解決樹的相關問題最有效和最常用的方法之一。
我們知道,樹可以以遞迴的方式定義為乙個節點(根節點),它包括乙個值和乙個指向其他節點指標的列表。 遞迴是樹的特性之一。 因此,許多樹問題可以通過遞迴的方式來解決。 對於每個遞迴層級,我們只能關注單個節點內的問題,並通過遞迴呼叫函式來解決其子節點問題。
通常,我們可以通過自頂向下或自底向上的遞迴來解決樹問題。
自頂向下意味著在每個遞迴層級,我們將首先訪問節點來計算一些值,並在遞迴呼叫函式時將這些值傳遞到子節點。 所以自頂向下的解決方案可以被認為是一種前序遍歷。 具體來說,遞迴函式top_down(root, params)
的原理是這樣的:
自底向上是另一種遞迴方法。 在每個遞迴層次上,我們首先對所有子節點遞迴地呼叫函式,然後根據返回值和根節點本身的值得到答案。 這個過程可以看作是後序遍歷的一種。 通常,自底向上的遞迴函式bottom_up(root)
為如下所示:
題目描述
解題思路及實現
1、自頂向下
class
solution
private
void
max_depth
(treenode root,
int depth)
max_depth
(root.left, depth +1)
;max_depth
(root.right, depth +1);}}
2、自底向上class
solution
private
intmax_depth2
(treenode root)
}
題目描述
解題思路及實現
這道題筆者的思路是迭代,後來發現非常困難,看了題解才發現,將同乙個樹作為2次引數分別放入遞迴函式進行遞迴,確實是乙個很棒的思路。
class
solution
private
boolean
ismirror
(treenode t1, treenode t2)
}
題目描述
解題思路及實現
比較簡單,標準的dfs
進行遞迴:
class
solution
private
boolean
dfs(treenode root,
int currentsum,
int target)
int sum = currentsum + root.val;
if(root.left != null || root.right != null)
else
}}
例題:
hello,我是 卻把清梅嗅 ,如果您覺得文章對您有價值,歡迎 ❤️,也歡迎關注我的 部落格 或者 github。
運用遞迴解決二叉樹問題
二叉樹的各種遍歷方法可以參考我的部落格 二叉樹的各種遍歷方法。給定乙個二叉樹,找出其最大深度。二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。說明 葉子節點是指沒有子節點的節點。definition for a binary tree node.class treenode def init...
二叉樹相關問題
前序,中序非遞迴比較容易 前序 先一直壓左孩子,每次壓棧的時候就列印,沒有左孩子可壓,就出棧,同時把右孩子壓棧,繼續一直壓左孩子 中序 先一直壓左孩子,沒有左孩子可壓,就出棧,出棧的時候列印,同時把右孩子壓棧,繼續一直壓左孩子 而後續因為要把左右孩子都遍歷完了才能列印當前節點node,而又不能通過n...
二叉樹相關問題
樹的基本概念 樹的度 樹中所有節點中最大的度 節點的層數 節點的層數從樹根開始計算,根節點是第一層,依次向下為第2.3.n層,樹的深度 樹中節點的最大層數稱為樹的深度。完全二叉樹 二叉樹中除最後一層外,其他各層的節點數都達到最大個數,且最後一層葉節點按照從左向右的順序連續存在,只缺最後一層右側若干節...