您當前的位置:首頁 > 攝影

[二叉樹的面試演算法](八)之二叉樹演算法解題思路總結(26題)

作者:由 蘇小樂 發表于 攝影時間:2019-09-24

在前面七篇關於二叉樹的文章中,列舉了二叉樹常見的七種題型。在解題的過程中,發現用遞迴,迭代和新增臨時變數記錄中間資訊這三種方法,是常見的套路。接下來,對前文中,二叉樹出現的所有題目,按照這三種解題方法來分類,進行彙總。

[二叉樹的面試演算法](八)之二叉樹演算法解題思路總結(26題)

1。遞迴方式

1.1 基本遞迴

1。 線上OJ練習地址:二叉樹的前序遍歷

2。 線上OJ練習地址:二叉樹的中序遍歷

3。 線上OJ練習地址:二叉樹的後序遍歷

三種基本的遍歷方式,都可以用遞迴來實現。寫遞迴演算法的時候,需要注意遞迴退出條件以及遞迴操作的表達。

4。 二叉樹的節點個數 - leetcode222

5。 二叉搜尋樹的最近公共祖先-Leetcode235

6。 二叉樹的最近公共祖先-leetcode236

二叉樹節點的個數

中,

該題的遞迴的思想為

:當root為空時,返回0,否則,返回左子樹的節點數+右子樹的節點數+1;在

求二叉搜尋樹的最近公共祖先

中,根據二叉搜尋樹的特性,若節點小於根節點,則在根節點的左子樹中,若大於根節點,則在根節點的右子樹中。所以,

該題的遞迴思路是

:若節點p,q均小於根節點,則返回左子樹的最低公共祖先。若兩者均大於根節點,則返回右子樹的最低公共祖先,否則,最低公共祖先即為當前根節點。同理,在

求二叉樹的最近公共祖先

中,先查詢p,q是否在左子樹中,結果記錄為left,再查詢p,q是否在右子樹中,結果記錄為right;若p,q不都在左子樹或者右子樹中,則當前root的節點為最近公共祖先,否則,left,right中不為空的為最近公共祖先。

7。 二叉樹的最大深度-leetcode104

8。 二叉樹的最小深度 -leetcode111

二叉樹的最大深度

,即若根節點為空,返會0,否則返回左右子樹中高度較大者+1。求

二叉樹的最小深度

,若根節點為空,返回0,若左右孩子均為非空,返回較小的子樹的高度+1,否則,返回非空子樹的高度+1;

1.2 基本遞迴 + 臨時變數

09。 二叉樹的所有路徑-leetcode257

10。 二叉樹中和為某一值的路徑_牛客網

11。 二叉樹的直徑_leetcode545

求二叉樹的所有路徑

,即先序遍歷二叉樹。當到達葉子節點時,將路徑儲存到結果集中。在這個過程中,需要新建path臨時變數,存放路徑的資訊;在

求二叉樹的和為某一值的路徑

中,依舊是先序遍歷二叉樹,在到達葉子節點是,比較路徑的和,是否與target相等,若相等則儲存路徑,否則不儲存。在

求二叉樹的直徑一題

中,在求二叉樹的高度的過程中,透過一個變數來記錄二叉樹中直徑的最大值。

12。 判斷兩棵二叉樹是否相同_leetcode100

13。 判斷一棵樹是否是平衡二叉樹_leetcode110

14。 翻轉二叉樹_leetcode226

15。 判斷一棵樹是否為對稱二叉樹_leetcode101

在判斷樹的結構中,遞迴是最好的方法。

判斷兩棵二叉樹是否相同

,只要判斷根節點相同,且root1的左孩子與root2的左孩子相同且root1的右孩子與root2的右孩子結構相同;同理,

判斷是否為平衡二叉樹中

,要求root左孩子高度與右孩子高度只差不超過1,且左右孩均為平衡二叉樹。在

翻轉二叉樹

中,先將當前節點的左孩子和右孩子交換。然後分別對左子樹和右子樹遞迴進行翻轉操作;

在判斷對稱二叉樹中

,可轉換為,遞迴判斷左子樹和右子樹的結構一樣。

16。 從前序與中序遍歷序列構造二叉樹_leetcode105

17。 從中序與後序遍歷序列構造二叉樹_leetcode106

18。 根據前序和後序遍歷構造二叉樹_leetcode889

在重構二叉樹中,主要也是用到了遞迴演算法。根據前序/後續遍歷確定根節點,然後結合中序遍歷,確定左子樹和右子樹對應的前序/中序序列,遞迴構造。

2。迭代方式

2.1 棧+臨時變數+迭代

19。 二叉樹的後序遍歷經典非遞迴版

20。 二叉搜尋樹中第K小的元素-leetcode230

21。 二叉樹的下一個結點_牛客網

二叉樹的後序遍歷經典非遞迴版

一文中,後序遍歷的非遞迴實現,使用的是棧+臨時變數prev,curr分別記錄前一個訪問節點和當前訪問節點,來實現非遞迴遍歷。

求二叉搜尋樹的第K小元素

中,新增一個計數器+棧實現中序遍歷,實現對第K個元素的跟蹤。在求

二叉樹中的中序遍歷下一個節點中,

該題目的樹節點多了一個指標,來實現對父節點的記錄,從而可以結合棧來實現輸出下一個節點。

22。 二叉樹的鋸齒形層次遍歷_leetcode103

二叉樹的鋸齒形層次遍歷中,使用兩個棧,分別存放奇數層和偶數層的節點。

2.2佇列+臨時變數+迭代

23。 二叉樹的層次遍歷

24。 自下而上分層遍歷_leetcode107

25。列印二叉樹第K層節點(小米一面筆試題)

層次遍歷

,使用佇列存放每一層節點,一個臨時變數len,記錄每一層的節點個數。

自下而上的分層遍歷中

,在層次遍歷的基礎上,將每一層的結果插入結果集的最前面,即可實現。列印第K層節點,新增一個計數器,來記錄節點的層數。

26。 二叉樹的序列化與反序列化_leetcode297

在二叉樹的序列化和反序列化一題中,主要是結合來處理字串一起處理。透過特殊字元來記錄空指標資訊。可以很方便的重構出二叉樹。

標簽: 二叉樹  節點  遍歷  遞迴  左子