摘要:如果子樹中有目標(biāo)節(jié)點,標(biāo)記為那個目標(biāo)節(jié)點,如果沒有,標(biāo)記為。顯然,如果左子樹右子樹都有標(biāo)記,說明就已經(jīng)找到最小公共祖先了。如果在根節(jié)點為的左右子樹中找的公共祖先,則必定是本身。只有一個節(jié)點正好左子樹有,右子樹也有的時候,才是最小公共祖先。
Lowest Common Ancestor of a Binary Search Tree 最新更新請見:https://yanjia.me/zh/2019/02/...
二分法 復(fù)雜度Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______6______ / ___2__ ___8__ / / 0 _4 7 9 / 3 5For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.
時間 O(h) 空間 O(h) 遞歸棧空間
思路對于二叉搜索樹,公共祖先的值一定大于等于較小的節(jié)點,小于等于較大的節(jié)點。換言之,在遍歷樹的時候,如果當(dāng)前結(jié)點大于兩個節(jié)點,則結(jié)果在當(dāng)前結(jié)點的左子樹里,如果當(dāng)前結(jié)點小于兩個節(jié)點,則結(jié)果在當(dāng)前節(jié)點的右子樹里。
代碼public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q); if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q); return root; } }Lowest Common Ancestor of a Binary Tree 最新更新請見:https://yanjia.me/zh/2019/02/...
深度優(yōu)先標(biāo)記 復(fù)雜度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 v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______3______ / ___5__ ___1__ / / 6 _2 0 8 / 7 4For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.
時間 O(h) 空間 O(h) 遞歸??臻g
思路我們可以用深度優(yōu)先搜索,從葉子節(jié)點向上,標(biāo)記子樹中出現(xiàn)目標(biāo)節(jié)點的情況。如果子樹中有目標(biāo)節(jié)點,標(biāo)記為那個目標(biāo)節(jié)點,如果沒有,標(biāo)記為null。顯然,如果左子樹、右子樹都有標(biāo)記,說明就已經(jīng)找到最小公共祖先了。如果在根節(jié)點為p的左右子樹中找p、q的公共祖先,則必定是p本身。
換個角度,可以這么想:如果一個節(jié)點左子樹有兩個目標(biāo)節(jié)點中的一個,右子樹沒有,那這個節(jié)點肯定不是最小公共祖先。如果一個節(jié)點右子樹有兩個目標(biāo)節(jié)點中的一個,左子樹沒有,那這個節(jié)點肯定也不是最小公共祖先。只有一個節(jié)點正好左子樹有,右子樹也有的時候,才是最小公共祖先。
代碼public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //發(fā)現(xiàn)目標(biāo)節(jié)點則通過返回值標(biāo)記該子樹發(fā)現(xiàn)了某個目標(biāo)結(jié)點 if(root == null || root == p || root == q) return root; //查看左子樹中是否有目標(biāo)結(jié)點,沒有為null TreeNode left = lowestCommonAncestor(root.left, p, q); //查看右子樹是否有目標(biāo)節(jié)點,沒有為null TreeNode right = lowestCommonAncestor(root.right, p, q); //都不為空,說明做右子樹都有目標(biāo)結(jié)點,則公共祖先就是本身 if(left!=null&&right!=null) return root; //如果發(fā)現(xiàn)了目標(biāo)節(jié)點,則繼續(xù)向上標(biāo)記為該目標(biāo)節(jié)點 return left == null ? right : left; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64470.html
摘要:遞歸左右子樹,若左右子樹都有解,那么返回根節(jié)點若僅左子樹有解,返回左子樹若僅右子樹有解,返回右子樹若都無解,返回。對于而言,更為簡單公共祖先一定是大于等于其中一個結(jié)點,小于等于另一個結(jié)點。 Problem Given the root and two nodes in a Binary Tree. Find the lowest common ancestor(LCA) of the ...
摘要:如果左右子樹返回的最低共同父節(jié)點值都不是空,說明和分別位于的左右子樹,那么就是最低共同父節(jié)點。 235題-題目要求 Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of L...
摘要:在為根的二叉樹中找的如果找到了就返回這個如果只碰到,就返回如果只碰到,就返回如果都沒有,就返回三種情況都在左子樹中,都在右子樹中,左右分別在二叉樹的左右子樹找和,找到及返回,根據(jù)和是否存在內(nèi)容決定最低公共祖先終止條件,找到或者,或者到,就在 在root為根的二叉樹中找A,B的LCA: 如果找到了就返回這個LCA 如果只碰到A,就返回A 如果只碰到B,就返回B 如果都沒有,就返回null...
摘要:月下半旬攻略道題,目前已攻略題。目前簡單難度攻略已經(jīng)到題,所以后面會調(diào)整自己,在刷算法與數(shù)據(jù)結(jié)構(gòu)的同時,攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚有什么區(qū)別...
摘要:無關(guān)知識點精通一個領(lǐng)域切碎知識點刻意練習(xí)反饋切題四件套審題所有解法比較時間空間復(fù)雜度加強編碼測試用例數(shù)組,鏈表數(shù)組查詢插入刪除鏈表查詢插入刪除翻轉(zhuǎn)鏈表兩兩翻轉(zhuǎn)鏈表判斷鏈表是否有環(huán)棧,隊列判斷合法括號棧模擬隊列隊列模擬棧找第大的元素 showImg(https://segmentfault.com/img/bVbqeRl?w=1600&h=1126); 無關(guān)知識點 1.精通一個領(lǐng)域: ...
閱讀 985·2021-11-22 09:34
閱讀 2168·2021-11-11 16:54
閱讀 2206·2021-09-27 14:00
閱讀 950·2019-08-30 15:55
閱讀 1537·2019-08-29 12:46
閱讀 610·2019-08-26 18:42
閱讀 648·2019-08-26 13:31
閱讀 3191·2019-08-26 11:52