給出乙個二叉樹,輸入兩個樹節點,求它們的最低公共祖先。
乙個樹節點的祖先節點包括它本身。
注意:輸入的二叉樹不為空;
輸入的兩個節點一定不為空,且是二叉樹中的節點;
解法一,使用遞迴,若兩個樹節點在根節點的左右子樹上,則公共節點為根節點;若兩個樹節點都在某一子樹上,則公共節點在該子樹上。這個方法遞迴都要查詢某一子樹上是否有節點存在,時間複雜度較高。
# 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 root == q or root == p:
return root
ifnot root.left:
return self.lowestcommonancestor(root.right, p, q)
ifnot root.right:
return self.lowestcommonancestor(root.left, p, q)
pinlefttree, qinlefttree = self.isnodeintree(root.left, p)
, self.isnodeintree(root.left, q)
if pinlefttree and qinlefttree:
return self.lowestcommonancestor(root.left, p, q)
ifnot pinlefttree and
not qinlefttree:
return self.lowestcommonancestor(root.right, p, q)
return root
defisnodeintree
(self, root, node)
:if root == node:
return
true
return
(root.left and self.isnodeintree(root.left, node))or
(root.right and self.isnodeintree(root.right, node)
)
解法二,先找出從根節點到兩個樹節點的路徑,然後轉化為求兩個鍊錶的公共節點。
# 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
"""pathtop, pathtoq =
, self.iterate(root, p, pathtop)
self.iterate(root, q, pathtoq)
diff =
len(pathtop)
-len
(pathtoq)
if diff <0:
startq =
len(pathtoq)-1
+ diff
startp =
len(pathtop)-1
else
: startp =
len(pathtop)-1
- diff
startq =
len(pathtoq)-1
while
(startp >=0)
:if pathtop[startp]
== pathtoq[startq]
:return pathtop[startp]
else
: startp -=
1 startq -=
1def
iterate
(self, root, node, path)
:if root == node:
return
true
if root.left:
if self.iterate(root.left, node, path)
:return
true
if root.right:
if self.iterate(root.right, node, path)
:return
true
path.pop(
)
《劍指offer》樹中兩個結點的最低公共祖先
說實話,和這題很有緣分。首先,這個題目給我印象很深,其次,今天在做蘑菇街實習生筆試時遇到了這個題目,所以感覺應該寫部落格,把這個題目記錄下來。筆試時遇到的題目是 給定二叉樹中的兩個結點,尋找最低公共節點。這是一種情況,是比較簡單的情況。這種情況就相當於求兩條鍊錶的公共節點。求解很簡單,先把遍歷把兩條...
劍指offer 68 節點的公共祖先
初始 給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。思路 對於二叉搜尋樹其後序遍歷有序,因此若當前節點的值大於兩個節點的值,則說明這兩個節點在當前節點的左子樹中,若當前節點的值小於兩個節點的值,則說明這兩個節點在當前節點的右子樹中。class solution if root.val p...
劍指Offer 68 二叉樹的最近公共祖先
迴圈搜尋 當節點 root 為空時跳出 當 p,q都在 root 的 右子樹 中,則遍歷至 root.right 否則,當 p,q 都在 root 的 左子樹 中,則遍歷至 root.left 否則,說明找到了 最近公共祖先 跳出。返回值 最近公共祖先 root treenode lowestcom...