1. 程式人生 > 其它 >力扣刷題筆記12-二叉樹系列(2)

力扣刷題筆記12-二叉樹系列(2)

1.遞增順序搜尋樹

解題思路:這道題非常簡單,題目已經告訴要使用中序遍歷了,所以我們只需中序遍歷二叉搜尋樹,並把遍歷後的值按順序放入vector中,

然後根據陣列中的節點值,建立等價的只含有右節點的二叉搜尋樹,其過程等價於根據節點值建立一個連結串列。具體程式碼如下:

2.二叉樹的鋸齒形層次遍歷

解題思路:這道題就是二叉樹層次遍歷的一個變型,我們只需在層次遍歷基礎上增加一個變數num記錄該層的位於第幾層,每遍歷一層就要判斷num是否是偶數,

如果是偶數就要將該層的vector中元素翻轉。否則保持不變,最後將該層的vector陣列壓入到結果vecor中。具體程式碼如下:

3.葉子相似的樹

解題思路:這道題也是一道簡單題,我們只需遍歷一遍二叉樹(我使用的是中序遍歷),然後將樹中的葉子節點存放到一個vector中,

然後判斷兩個vector是否相等即可。具體程式碼如下:

4.二叉樹的堂兄弟結點

解題思路:這道題使用層次遍歷比較方便,我們可以定義兩個變數father1和father2(初始值都為-1)來記錄兩個目標結點的父節點在上一層的位置,

每經過一層的遍歷就要進行一次判斷。如果找到了目標結點且 father1!=father2&&father1!=-1&&father2=-1 則可以返回true,否則返回false。具體程式碼

如下所示:

5.二叉樹的最近公共祖先

解題思路:

遇到這個題目首先想的是要是能自底向上查詢就好了,這樣就可以找到公共祖先了。後序遍歷就是天然的回溯過程,最先處理的一定是葉子節點。

接下來就看如何判斷一個節點是節點q和節點p的公共公共祖先呢。如果找到一個節點,發現左子樹出現結點p,右子樹出現節點q,或者 左子樹出現結點q,右子樹出現節點p,

那麼該節點就是節點p和q的最近公共祖先。使用後序遍歷,回溯的過程,就是從低向上遍歷節點,一旦發現如何這個條件的節點,就是最近公共節點了。

遞迴三部曲:

確定遞迴函式返回值以及引數
需要遞迴函式返回值,來告訴我們是否找到節點q或者p,那麼返回值為bool型別就可以了。但我們還要返回最近公共節點,可以利用上題目中返回值是TreeNode * ,那麼如果遇到p或者q,就把q或者p返回,返回值不為空,就說明找到了q或者p。

程式碼如下:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)

確定終止條件
如果找到了 節點p或者q,或者遇到空節點,就返回。程式碼如下:if (root == q || root == p || root == NULL) return root;

完整程式碼如下: