S O 68 最近公共祖先問題

2021-10-25 16:22:47 字數 2710 閱讀 9493

1.二叉搜尋樹中兩個節點的最近公共祖先

2.二叉樹中兩個節點的最近公共祖先

參考:大神的link

若節點 p 在節點 root的左(右)子樹中,或 p=root,則稱 root 是 p 的祖先

最近公共祖先的定義: 設節點root 為節點 p,q的某公共祖先,若其左子節點 root.left 和右子節點root.right 都不是 p,q 的公共祖先,則稱root 是 「最近的公共祖先」 。

根據以上定義,若root 是 p,q的 最近公共祖先 ,則只可能為以下情況之一:

說明:

所有節點的值都是唯一的。

p、q 為不同節點且均存在於給定的二叉搜尋樹中。

輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4

輸出: 2

解釋: 節點 2 和節點 4 的最近公共祖先是 2, 因為根據定義最近公共祖先節點可以為節點本身。

因為二叉樹搜尋樹節點有序,所以問題變得簡單。如果節點p比當前節點小,則說明節點p在當前節點的左子樹;如果節點p比當前節點大,則說明節點p在當前節點的右子樹。

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

輸出: 5

解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。因為根據定義最近公共祖先節點可以為節點本身。

考慮通過遞迴對二叉樹進行後序遍歷,當遇到節點 p 或 q 時返回。從底至頂回溯,當節點 p, q在節點 root 的異側時,節點 root即為最近公共祖先,則向上返回 root 。

終止條件:

遞推工作:

返回值: 根據 left 和 right ,可展開為四種情況;

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

lowestcommonancestor

(self, root: treenode, p: treenode, q: treenode)

-> treenode:

ifnot root or root==p or q==root:

return root

left=self.lowestcommonancestor(root.left,p,q)

right=self.lowestcommonancestor(root.right,p,q)

ifnot left and

not right:

return

ifnot left:

return right

ifnot right:

return left

return root

--------------2021-02-09-------------

最近公共祖先問題

最近公共祖先 least common ancestors 問題是面試中經常出現的乙個問題,這種問題變種很多,解法也很多。最近公共祖先問題的定義如下 對於有根樹t的兩個結點u v,最近公共祖先lca t,u,v 表示乙個結點x,滿足x是u v的祖先且x的深度盡可能大。另一種理解方式是把t理解為乙個無...

最近公共祖先問題

在樹中尋找兩個結點的最近公共祖先 從樹的根節點開始進行深度優先搜尋,每次經過某乙個點 無論是從它的父親節點進入這個點,還是從它的兒子節點返回這個點,都按順序記錄下來。這樣就把一棵樹轉換成了乙個陣列。而找到樹上兩個節點的最近公共祖先,無非就是找到這兩個節點最後一次出現在陣列中的位置所囊括的一段區間中深...

最近公共祖先 python 最近公共祖先

lca演算法樸素演算法 也就是我們所說的暴力演算法,大致的思路是從樹根開始,往下迭代,如果當前結點比兩個結點都小,那麼說明要從樹的右子樹中找 相反則從左子樹中查詢 直到找到乙個結點在當前結點的左邊,乙個在右邊,說明當前結點為最近公共祖先,如果乙個結點是另外乙個結點的祖先,那麼返回前面結點的父親結點即...