力扣刷題筆記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;
完整程式碼如下: