運用遞迴解決二叉樹相關問題

2021-10-03 11:47:21 字數 2173 閱讀 5494

在之前的章節中,我們已經介紹了如何解決樹的遍歷問題。我們也已經嘗試過使用遞迴解決樹的為前序遍歷中序遍歷後序遍歷問題。

事實上,遞迴是解決樹相關問題的最有效和最常用的方法之一。本節中,我們將會介紹兩種典型的遞迴方法。

本小節內容節選自 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層,樹的深度 樹中節點的最大層數稱為樹的深度。完全二叉樹 二叉樹中除最後一層外,其他各層的節點數都達到最大個數,且最後一層葉節點按照從左向右的順序連續存在,只缺最後一層右側若干節...