面試題68 ii. 二叉樹的最近公共祖先
給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
直接上**
class solution:
def lowestcommonancestor(self, root, p, q) -> 'treenode':
if not root or root == p or root == q:
return root
left = self.lowestcommonancestor(root.left, p, q)
right = self.lowestcommonancestor(root.right, p, q)
if not left: return right
if not right: return left
return root
**比較簡單, 但是這個遞迴不好理解, 解釋如下:
class solution:
def lowestcommonancestor(self, root, p, q) -> 'treenode':
if not root or root == p or root == q:
return root
# 如果都在左子樹中,則返回最終的結果
# 如果左子樹有乙個, 則返回該節點
# 如果都不存在則返回 none
left = self.lowestcommonancestor(root.left, p, q)
# 返回結果與左子樹相同
right = self.lowestcommonancestor(root.right, p, q)
# 如果左為空,則返回右節點的結果
# 右節點為空則,p, q都不在該節點下
# 右節點不為空, 則該節點下有乙個
if not left: return right
# 前提:左節點有返回值, 右節點乙個也沒有,返回左節點
if not right: return left
# 左右節點都不為空,則分別有乙個節點,那該節點就是最近父節點了
return root
S O 68 最近公共祖先問題
1.二叉搜尋樹中兩個節點的最近公共祖先 2.二叉樹中兩個節點的最近公共祖先 參考 大神的link 若節點 p 在節點 root的左 右 子樹中,或 p root,則稱 root 是 p 的祖先 最近公共祖先的定義 設節點root 為節點 p,q的某公共祖先,若其左子節點 root.left 和右子節...
最近公共祖先 python 最近公共祖先
lca演算法樸素演算法 也就是我們所說的暴力演算法,大致的思路是從樹根開始,往下迭代,如果當前結點比兩個結點都小,那麼說明要從樹的右子樹中找 相反則從左子樹中查詢 直到找到乙個結點在當前結點的左邊,乙個在右邊,說明當前結點為最近公共祖先,如果乙個結點是另外乙個結點的祖先,那麼返回前面結點的父親結點即...
節點的最近公共祖先 倍增演算法
題目描述 這是乙個裸的lca問題,即求書上兩個節點的最近公共祖先。我們可以用樹上倍增來做 當然,在做之前我們假設不知道該演算法。那麼我們如何來做這種型別的題目呢?顯然,我們可以用暴力來做,找到兩點的最近公共祖先,我們可以用前向星存雙向邊,然後依次儲存每個點到的根的路徑。然後找到最先同時出現在兩條路徑...