68題 最近公共節點 python3解答

2021-10-05 22:45:50 字數 1109 閱讀 3804

面試題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問題,即求書上兩個節點的最近公共祖先。我們可以用樹上倍增來做 當然,在做之前我們假設不知道該演算法。那麼我們如何來做這種型別的題目呢?顯然,我們可以用暴力來做,找到兩點的最近公共祖先,我們可以用前向星存雙向邊,然後依次儲存每個點到的根的路徑。然後找到最先同時出現在兩條路徑...