我們考慮用遞迴,由於我們需要知道當前結點到底是不是要找的祖先結點,因此需要返回值bool,但跟題目返回型別是treenode不同,還需要重新寫乙個遞迴函式,考慮能不能用treenode表示我們想要的結果:null代表該節點不是目標祖先或目標祖先的祖先(有可能本身該節點是空結點,也有可能是本身非空,但自己下面的子孫並沒有找到p或者q,也要返回null;注意:當找到目標祖先後,接著往第一層根節點回溯的途中,路徑上經過的結點也都會返回非空,才能將結果一層一層返回到根結點處返回),非空就代表以root為根節點的子樹中(包含root本身)至少找到了p,q中的乙個;
思考時要按乙個普通結點去想,把主要邏輯想明白,再去考慮特殊結點是否適合,是否需要加額外判斷等等;
現在考慮乙個普通的節點root,若root本身就是p,q其中乙個就直接返回root,代表以root為根結點的子樹最終找到了乙個目標結點。當然root為空也直接返回,就像正常的後序遍歷一樣,也可以理解為以root為根節點的子樹最後沒找到目標結點;若root自己不是目標結點且非空,那麼就要想辦法去看看它的子孫後代裡面是否有,那麼就對root->left和root->right分別遞迴呼叫,並儲存返回值l和r;最後root到底是不是我們要找的最近公共祖先,就需要看l和r的結果了;這道題的遞迴雖然有返回值,但實際也要遍歷整棵樹,畢竟函式最初的入口是第一層根節點root,即使我們從下往上找到了那個公共祖先結點,也要一層一層返回上來,最後由第一層遞迴返回最終結果
//後序遍歷
class
solution
;
236 二叉樹最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。最近公共祖先的定義為 對於有根樹 t 的兩個結點 p q,最近公共祖先表示為乙個結點 x,滿足 x 是 p q 的祖先且 x 的深度盡可能大 乙個節點也可以是它自己的祖先 例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,nu...
236 二叉樹的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1輸出 3解釋 節點5和節點1的最近公共祖先是節點3。示例 2 ...
236 二叉樹的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 解釋 節點 5 和節點 1 的最近公共祖先是節點 ...