給定乙個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。
後序遍曆法,將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 的最近公共祖先是節點 ...