236. 二叉樹(shù)的最近公共祖先

題目鏈接:

236. 二叉樹(shù)的最近公共祖先

題目描述:

給定一個(gè)二叉樹(shù), 找到該樹(shù)中兩個(gè)指定節(jié)點(diǎn)的最近公共祖先珠插。

百度百科中最近公共祖先的定義為:“對(duì)于有根樹(shù) T 的兩個(gè)結(jié)點(diǎn) p掀宋、q事镣,最近公共祖先表示為一個(gè)結(jié)點(diǎn) x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個(gè)節(jié)點(diǎn)也可以是它自己的祖先)∷ⅲ”

例如,給定如下二叉樹(shù): 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
解釋: 節(jié)點(diǎn) 5 和節(jié)點(diǎn) 1 的最近公共祖先是節(jié)點(diǎn) 3琐驴。

示例 2:

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節(jié)點(diǎn) 5 和節(jié)點(diǎn) 4 的最近公共祖先是節(jié)點(diǎn) 5俘种。因?yàn)楦鶕?jù)定義最近公共祖先節(jié)點(diǎn)可以為節(jié)點(diǎn)本身。

說(shuō)明:

  • 所有節(jié)點(diǎn)的值都是唯一的绝淡。
  • p宙刘、q 為不同節(jié)點(diǎn)且均存在于給定的二叉樹(shù)中。

算法:

此題比235.二叉搜索樹(shù)的最近公共祖先更難牢酵。對(duì)于二叉搜索樹(shù)而言悬包,樹(shù)的結(jié)點(diǎn)本身有序,只需要搜索到的節(jié)點(diǎn)的值進(jìn)行比較馍乙,很容易就得到了最近公共祖先布近,但是此題是對(duì)任意二叉樹(shù)進(jìn)行操作垫释,難度顯然更大。

首先吊输,對(duì)于二叉樹(shù)的搜索饶号,我們通常使用的是遞歸操作铁追。遞歸操作講究的是分而化之季蚂。基本的思路都是:

TreeNode* fun(TreeNode* root) {
  if (root == NULL)
    return NULL;
  if (root 滿足條件)
    return root;
  ...
  其他操作
  ...

  TreeNode*  left = fun(root->left);
  TreeNode*  right = fun(root->right);

  ...
  其他操作
  ...
  return result;
}

我們把模型化為一個(gè)根節(jié)點(diǎn)琅束,與左子樹(shù)和右子樹(shù)扭屁。考慮根節(jié)點(diǎn)涩禀,如果根節(jié)點(diǎn)為公共祖先料滥,需要滿足什么情況?

  • 根節(jié)點(diǎn)為p或者q
  • 根節(jié)點(diǎn)的左子樹(shù)和右子樹(shù)分別找到p和q。

顯然我們的偽代碼為:

if (root == p || root == q)
  return root;
if (root->left 存在p或q && root->right 存在p或q)
  return root;

再考慮左右子樹(shù)艾船,顯然葵腹,我們對(duì)左右子樹(shù)調(diào)用函數(shù)本身,返回的一定是q或p或公共祖先屿岂。那么践宴,如果左右兩邊都返回結(jié)果,就一定是p和q爷怀,則root為公共祖先阻肩;如果有一邊為NULL,則表示另一邊一定是公共祖先运授。題目已解烤惊。

代碼:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == NULL)
            return root;
        
        // 一個(gè)節(jié)點(diǎn)也可以是它自己的祖先
        if (root == p || root == q)
            return root;
        
        // 調(diào)用函數(shù)本身,有可能返回p, q, NULL
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        
        // 都不等于NULL吁朦,說(shuō)明p柒室,q在左右兩邊。否則left或者right即為公共節(jié)點(diǎn)
        if (left != NULL && right != NULL)
            return root;
        else if (left != NULL)
            return left;
        else
            return right;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逗宜,一起剝皮案震驚了整個(gè)濱河市伦泥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锦溪,老刑警劉巖不脯,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刻诊,居然都是意外死亡防楷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)则涯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)复局,“玉大人冲簿,你說(shuō)我怎么就攤上這事∫诨瑁” “怎么了峦剔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)角钩。 經(jīng)常有香客問(wèn)我吝沫,道長(zhǎng),這世上最難降的妖魔是什么递礼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任惨险,我火速辦了婚禮,結(jié)果婚禮上脊髓,老公的妹妹穿的比我還像新娘辫愉。我一直安慰自己,他們只是感情好将硝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布恭朗。 她就那樣靜靜地躺著,像睡著了一般依疼。 火紅的嫁衣襯著肌膚如雪痰腮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天涛贯,我揣著相機(jī)與錄音诽嘉,去河邊找鬼。 笑死弟翘,一個(gè)胖子當(dāng)著我的面吹牛虫腋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稀余,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悦冀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了睛琳?” 一聲冷哼從身側(cè)響起盒蟆,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎师骗,沒(méi)想到半個(gè)月后历等,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辟癌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年寒屯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寡夹,死狀恐怖处面,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菩掏,我是刑警寧澤魂角,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站智绸,受9級(jí)特大地震影響野揪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜传于,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一囱挑、第九天 我趴在偏房一處隱蔽的房頂上張望醉顽。 院中可真熱鬧沼溜,春花似錦、人聲如沸游添。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唆涝。三九已至找都,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廊酣,已是汗流浹背能耻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亡驰,地道東北人晓猛。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凡辱,于是被迫代替她去往敵國(guó)和親戒职。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容