遞歸-leetcode236. Lowest Common Ancestor of a Binary Tree

一、問題描述
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”
Given the following binary tree: root = [3,5,1,6,2,0,8,null,null,7,4]

image.png

Example :
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
Output: 3
Explanation: The LCA of nodes 5 and 1 is 3.

二秧饮、解決思路
思路一:給定兩節(jié)點p、q叹谁,要找到其公共父節(jié)點藏否,通過枚舉一些示例可以發(fā)現(xiàn),pq兩節(jié)點之間的關(guān)系無非是父子關(guān)系和擁有共同父節(jié)點学搜,若是父子關(guān)系,則父節(jié)點是所要求的節(jié)點论衍,若擁有共同父節(jié)點瑞佩,公共父節(jié)點是所要求的節(jié)點,因此可以采用遞歸來解決坯台,遞歸結(jié)束條件為當(dāng)前節(jié)點為null
思路二:思路一采用遞歸炬丸,可以采用非遞歸思路來解決,要采用非遞歸的話蜒蕾,可以保存pq兩節(jié)點的所有父節(jié)點稠炬,最后求出所要求的節(jié)點

三、算法實現(xiàn)
思路一

private TreeNode node;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return null;
        //if(root.left == null || root.right == null) return root;
        checkCommonAncestor(root, p, q);
        return this.node;
    }

    public boolean checkCommonAncestor(TreeNode root, TreeNode p, TreeNode q){
        if(root == null){
            return false;
        }
        boolean left = checkCommonAncestor(root.left, p, q);
        boolean right = checkCommonAncestor(root.right, p, q);
        boolean cur = (root == p || root == q);
        // pq位于root的左右兩邊
        if(left && right){
            this.node = root;
        }
        // pq中一節(jié)點為root節(jié)點
        if(cur && (left || right)){
            this.node = root;
        }
        return (left || right || cur);
    }

思路二

public boolean isNode(TreeNode root, TreeNode p, List<TreeNode> list){
        if(root == null){
            return false;
        }
        if(root == p){
            list.add(root);
            return true;
        } else{
            boolean left = isNode(root.left, p, list);
            boolean right = isNode(root.right, p, list);
            if(left || right) {
                list.add(root);
                return true;
            } else {
                return false;
            }
        }
    }

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) return null;
        List<TreeNode> list = new ArrayList<>();
        isNode(root, p, list);
        List<TreeNode> list1 = new ArrayList<>();
        isNode(root, q, list1);
        int i = list.size() - 1;
        int j = list1.size() - 1;
        while(i >= 0 && j >= 0){
            if(list.get(i) == list1.get(j)){
                i--;
                j--;
            } else {
                break;
            }
        }
        return list.get(i + 1);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咪啡,一起剝皮案震驚了整個濱河市首启,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撤摸,老刑警劉巖毅桃,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褒纲,死亡現(xiàn)場離奇詭異,居然都是意外死亡钥飞,警方通過查閱死者的電腦和手機莺掠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來代承,“玉大人汁蝶,你說我怎么就攤上這事渐扮÷坫玻” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵墓律,是天一觀的道長膀估。 經(jīng)常有香客問我,道長耻讽,這世上最難降的妖魔是什么察纯? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮针肥,結(jié)果婚禮上饼记,老公的妹妹穿的比我還像新娘。我一直安慰自己慰枕,他們只是感情好具则,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著具帮,像睡著了一般博肋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜂厅,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天匪凡,我揣著相機與錄音,去河邊找鬼掘猿。 笑死病游,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稠通。 我是一名探鬼主播衬衬,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼采记!你這毒婦竟也來了佣耐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤唧龄,失蹤者是張志新(化名)和其女友劉穎兼砖,沒想到半個月后奸远,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡讽挟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年懒叛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耽梅。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡薛窥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眼姐,到底是詐尸還是另有隱情诅迷,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布众旗,位于F島的核電站罢杉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贡歧。R本人自食惡果不足惜滩租,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望利朵。 院中可真熱鬧律想,春花似錦、人聲如沸绍弟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晌柬。三九已至姥份,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間年碘,已是汗流浹背澈歉。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工屿衅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留埃难,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓涤久,卻偏偏與公主長得像涡尘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子响迂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351