236 二叉樹的最近公共祖先

2021-09-27 03:24:23 字數 1720 閱讀 6282

給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]

示例 1:

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

輸出: 3

解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。

示例 2:

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

輸出: 5

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

說明:所有節點的值都是唯一的。

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

1.我的笨比方法:把兩個節點的祖先路徑找出來再比較

class solution:

def lowestcommonancestor(self, root: 'treenode', p: 'treenode', q: 'treenode') -> 'treenode':

def func(node,target):

nonlocal path

if not node:

return 0

if node==target:

return 1

if func(node.left,target):

return 1

elif func(node.right,target):

return 1

else:

path.pop()

return 0

path=

func(root,p)

pp=path[:]

path=

func(root,q)

qq=path[:]

res=root

for x,y in zip(pp,qq):

if x!=y:

break

else:

res=x #儲存最後一對相同祖先,即最深公共祖先

return res

2.純遞迴,找到p或q後往上一路返回,可以理解為p和q節點分別找到之後,分別往上回溯,直到發現某個節點的左右子樹分別找到p和q,此節點就是最深公共祖先。此方法是從下往上回溯的,所以不會出現不是最深的公共祖先的情況,最開始找到的公共祖先就一定是所求的最深公共祖先。

class solution:

def lowestcommonancestor(self, root: 'treenode', p: 'treenode', q: 'treenode') -> 'treenode':

def func(node):

if node==p or node==q or not node:

return node

le=func(node.left)

ri=func(node.right)

if le and ri: #p、q在當前節點左右子樹中找到了,當前節點即為最深公共祖先

return node

if not le: #左子樹沒找到

return ri

else:

return le

return func(root)

236 二叉樹最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。最近公共祖先的定義為 對於有根樹 t 的兩個結點 p q,最近公共祖先表示為乙個結點 x,滿足 x 是 p q 的祖先且 x 的深度盡可能大 乙個節點也可以是它自己的祖先 例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,nu...

236 二叉樹的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1輸出 3解釋 節點5和節點1的最近公共祖先是節點3。示例 2 ...

236 二叉樹的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 解釋 節點 5 和節點 1 的最近公共祖先是節點 ...