236 二叉樹的最近公共祖先

2022-01-23 02:08:29 字數 2003 閱讀 9233

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

後序遍曆法,將pq的公共父節點問題轉化為找到乙個節點node使得p、q分別位於node的左右子樹中;

只要找到其中的乙個結點,就不會繼續往下找,比如同在左子樹上,也就是上面說到的第二點;

如果是分別在兩邊子樹上,那麼left和right就都能夠找到,此時返回的就是他們的父親結點,也就是上面說到的第一點;

找出兩個結點的路徑,對路徑中的值進行比對,直到出現不一樣的結點為止;

# definition for a binary tree node.

# class treenode(object):

#     def __init__(self, x):

#         self.val = x

#         self.left = none

#         self.right = none

​class

solution(object):

deflowestcommonancestor(self, root, p, q):

"""遞迴

:type root: treenode

:type p: treenode

:type q: treenode

:rtype: treenode

"""if

notroot

orroot == p

orroot == q:

return

root

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

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

ifnot

left:

return

right

elif

notright:

return

left

return

root

​def

lowestcommonancestor(self, root, p, q):

"""比對路徑

:type root: treenode

:type p: treenode

:type q: treenode

:rtype: treenode

"""pathp, pathq = self.findpath(root, p), self.findpath(root, q)

lenp, lenq = len(pathp), len(pathq)

ans, x = none, 0

# 找出出現不一致的結點,則上乙個結點則為最近公共結點

while

x<

min(lenp, lenq) and

pathp[x] == pathq[x]:

ans, x = pathp[x], x+1

return

ansdef

findpath(self, root, target):

"""獲取結點的路徑

"""stack =

lastvisit = none

while

stack

orroot:

ifroot:

root = root.left

else:

peek = stack[-

1]if

peek.right

andlastvisit

!= peek.right:

root = peek.right

else:

ifpeek == target:

return

stack

lastvisit = stack.pop()

root = none

return

stack

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 的最近公共祖先是節點 ...